Flutter自定义协议处理插件cktap_protocol的使用

Coinkite Tap Protocol Flutter

一个用于实现Coinkite tap协议的Flutter库,主要用于与Satscard和Tapsigner配合使用。该插件实际上是Nunchuk的tap-protocol库的一个包装器。


当前状态

该项目目前处于开发阶段。它主要是为了支持Breez应用中的Satscard功能而开发的。一旦此需求完成,插件将更新以全面支持Satscard和Tapsigner。

平台支持

  • ✅ Android
  • ✅ iOS(仅限macOS)

功能支持

  • ✅ 在Windows上构建
  • ✅ 在macOS上构建
  • ✅ 在Linux上构建
  • ✅ 读取Satscards
  • ✅ 读取Tapsigners
  • ✅ 执行所有Satscard特定的NFC操作

待办事项

  • ❌ 支持macOS
  • ❌ 支持Linux
  • ❌ 支持Web
  • ❌ 支持Windows
  • ❌ 执行所有CKTapCard NFC操作
  • ❌ 执行所有Tapsigner特定的NFC操作
  • ❌ 暴露tap-protocol实用函数
  • ❌ 暴露替代的Tapsigner HWI API
  • ❌ 允许多个并发原生操作(当前会报错以避免崩溃)

开始使用

在开始之前,请确保安装了构建所需的工具:

所有平台

  • 确保已安装Android SDK,并设置环境变量$ANDROID_HOME指向包含命令行工具的有效位置。

macOS 13或更高版本

brew install cmake

macOS 12或更早版本

brew install cmake coreutils

项目结构

该项目采用以下目录结构:

.
├── lib/
│   └── 包含Dart代码,定义插件API并调用原生代码。
├── src/cpp/
│   └── 包含原生源代码及CMakeLists.txt文件,用于构建动态库。
├── android/
│   └── 包含Android平台的构建文件。
└── ios/
    └── 包含iOS平台的构建文件。

完整示例代码

以下是完整的示例代码,展示如何在Flutter项目中使用cktap_protocol插件。

main.dart

// 引入必要的包
import 'package:cktap_protocol_example/bloc/card_bloc.dart'; // 自定义业务逻辑
import 'package:cktap_protocol_example/ui/home_screen.dart'; // 主界面
import 'package:flutter/material.dart'; // Flutter核心框架
import 'package:flutter_bloc/flutter_bloc.dart'; // 使用BLoC模式

// 应用入口
void main() {
  runApp(MyApp()); // 启动应用
}

// 自定义MaterialApp类
class MyApp extends MaterialApp {
  MyApp({super.key}) 
      : super( // 设置应用主页
          home: BlocProvider( // 使用BLoC模式管理状态
            create: (_) => CardBloc(), // 创建CardBloc实例
            child: const HomeScreen(), // 渲染主界面
          ),
        );
}

更多关于Flutter自定义协议处理插件cktap_protocol的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义协议处理插件cktap_protocol的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


cktap_protocol 是一个自定义的 Flutter 插件,用于处理自定义协议(例如 cktap://)。通过这个插件,你可以在 Flutter 应用中注册自定义协议,并处理来自其他应用或网页的链接。

以下是如何使用 cktap_protocol 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 cktap_protocol 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  cktap_protocol: ^1.0.0  # 请根据实际情况使用最新版本

然后,运行 flutter pub get 来获取依赖。

2. 配置 Android 和 iOS

为了在 Android 和 iOS 上处理自定义协议,你需要进行一些配置。

Android

android/app/src/main/AndroidManifest.xml 文件中,添加以下内容:

<activity
    android:name=".MainActivity"
    android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="cktap" />
    </intent-filter>
</activity>

iOS

ios/Runner/Info.plist 文件中,添加以下内容:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>cktap</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>cktap</string>
        </array>
    </dict>
</array>

3. 在 Flutter 中使用 cktap_protocol

在 Flutter 应用中,你可以使用 cktap_protocol 插件来注册自定义协议并处理链接。

import 'package:flutter/material.dart';
import 'package:cktap_protocol/cktap_protocol.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _receivedUrl = '';

  @override
  void initState() {
    super.initState();
    _initProtocol();
  }

  void _initProtocol() async {
    // 注册自定义协议处理程序
    CktapProtocol.registerCallback((String url) {
      setState(() {
        _receivedUrl = url;
      });
    });

    // 获取初始 URL(如果应用是通过协议链接启动的)
    String initialUrl = await CktapProtocol.getInitialUrl();
    if (initialUrl != null) {
      setState(() {
        _receivedUrl = initialUrl;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Cktap Protocol Example'),
        ),
        body: Center(
          child: Text('Received URL: $_receivedUrl'),
        ),
      ),
    );
  }
}

4. 测试

现在,你可以通过点击类似 cktap://example 的链接来测试你的应用。当应用启动或处于前台时,它会捕获并处理这个链接,并在界面上显示接收到的 URL。

5. 处理深度链接

如果你想处理更复杂的深度链接,可以通过解析 _receivedUrl 来实现。例如:

void _parseUrl(String url) {
  Uri uri = Uri.parse(url);
  if (uri.host == 'example' && uri.pathSegments.isNotEmpty) {
    String action = uri.pathSegments[0];
    switch (action) {
      case 'open':
        // 处理打开操作
        break;
      case 'close':
        // 处理关闭操作
        break;
      default:
        // 处理未知操作
        break;
    }
  }
}
回到顶部