Flutter NFC管理插件cktap_transport_nfc_manager的使用

Flutter NFC管理插件cktap_transport_nfc_manager的使用

NFC Manager Transport for Coinkite Tap Protocol

这是一个基于cktap_transport实现的插件,使用了nfc_manager插件。目前此插件专为NFC Manager v3设计,当v4发布后,此插件将被重构以支持新的API。


平台支持

请使用release/v3分支,否则某些设备在执行CKTapCard.wait命令时可能会失败。自定义分支还允许你在iOS上更新NFC提示文本,从而提供更好的用户体验。

  • ✅ Android
  • ✅ iOS

开始使用

pubspec.yaml文件中添加以下依赖项:

dependencies:
  # 此传输插件专门用于cktap_protocol插件
  cktap_protocol: ^0.0.1
  
  # 推荐使用的方式,我们使用了一个支持设置IsoDep标签超时值的nfc_manager分支。
  # 不幸的是,官方nfc_manager代码库中缺少该功能
  cktap_transport_nfc_manager:
    git:
      url: https://github.com/PeteClubSeven/cktap-transport-nfc-manager.git
      ref: release/v3
  nfc_manager:
    git:
      url: https://github.com/PeteClubSeven/flutter-nfc-manager.git
      ref: release/v3

  # 使用未修改版本的nfc_manager
  cktap_transport_nfc_manager: ^0.1.0
  nfc_manager: ^3.3.0

使用示例

以下是一个完整的示例代码,展示了如何使用cktap_transport_nfc_manager插件来管理NFC设备并读取卡片信息:

import 'package:cktap_protocol/cktap_protocol.dart';
import 'package:cktap_protocol/cktapcard.dart';
import 'package:cktap_protocol/satscard.dart';
import 'package:cktap_protocol/tapsigner.dart';
import 'package:cktap_transport_nfc_manager/cktap_transport_nfc_manager.dart';
import 'package:nfc_manager/nfc_manager.dart';

void exampleFunction() {
  // 启动NFC会话
  NfcManager.instance.startSession(
    onDiscovered: (NfcTag tag) async {
      // 从给定的NFC标签创建传输对象
      final transport = NfcManagerTransport(tag);

      try {
        // 尝试读取卡片,发生错误时会抛出异常
        CKTapCard card = await CKTapProtocol.readCard(transport);

        // 检查卡片类型并将其转换为正确的子类
        if (card.isTapsigner) {
          // 如果是Tapsigner类型,进行进一步操作
          Tapsigner tapsigner = card.toTapsigner();
          var result = await tapsigner.wait(transport); // 等待操作完成
        } else {
          // 如果是Satscard类型,列出可用槽位
          Satscard satscard = card.toSatscard();
          var slots = await satscard.listSlots(transport);
        }
      } catch (e) {
        // 捕获并处理异常
        print('Error: $e');
      } finally {
        // 结束NFC会话
        NfcManager.instance.stopSession();
      }
    },
  );
}

更多关于Flutter NFC管理插件cktap_transport_nfc_manager的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter NFC管理插件cktap_transport_nfc_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


cktap_transport_nfc_manager 是一个用于在 Flutter 应用中管理 NFC 功能的插件。它允许开发者与 NFC 标签进行通信,读取和写入数据。以下是如何在 Flutter 项目中使用 cktap_transport_nfc_manager 插件的基本步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 cktap_transport_nfc_manager 依赖。

dependencies:
  flutter:
    sdk: flutter
  cktap_transport_nfc_manager: ^1.0.0 # 请使用最新版本

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

2. 配置 Android 和 iOS

Android

AndroidManifest.xml 文件中,确保启用了 NFC 功能。

<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />

iOS

Info.plist 文件中,添加 NFC 相关的配置。

<key>NFCReaderUsageDescription</key>
<string>我们需要访问NFC来读取标签信息。</string>

3. 使用插件

在你的 Flutter 代码中,你可以通过以下步骤来使用 cktap_transport_nfc_manager 插件。

初始化 NFC 管理器

首先,初始化 CKTapTransportNfcManager

import 'package:cktap_transport_nfc_manager/cktap_transport_nfc_manager.dart';

final nfcManager = CKTapTransportNfcManager();

检查 NFC 功能

在开始使用 NFC 之前,检查设备是否支持 NFC 功能。

bool isNfcSupported = await nfcManager.isNfcSupported();
if (isNfcSupported) {
  print("NFC is supported");
} else {
  print("NFC is not supported");
}

启动 NFC 会话

你可以启动一个 NFC 会话来读取或写入 NFC 标签。

await nfcManager.startSession(
  onDiscovered: (NfcTag tag) async {
    print("NFC Tag Discovered: ${tag.id}");
    // 你可以在这里处理读取或写入操作
  },
  onError: (NfcError error) {
    print("NFC Error: ${error.message}");
  },
);

停止 NFC 会话

在完成操作后,停止 NFC 会话。

await nfcManager.stopSession();

读取 NFC 标签数据

你可以读取 NFC 标签中的数据。

String? tagData = await nfcManager.readTag();
if (tagData != null) {
  print("Tag Data: $tagData");
} else {
  print("Failed to read tag data");
}

写入 NFC 标签数据

你也可以向 NFC 标签中写入数据。

bool writeSuccess = await nfcManager.writeTag("Hello, NFC!");
if (writeSuccess) {
  print("Data written successfully");
} else {
  print("Failed to write data");
}

4. 处理权限

确保在 Android 和 iOS 上处理 NFC 相关的权限。

5. 测试

在你的设备上运行应用,并测试 NFC 功能。确保设备支持 NFC,并且 NFC 功能已启用。

6. 错误处理

在使用 NFC 功能时,可能会遇到各种错误,例如标签不支持、读取或写入失败等。确保在代码中妥善处理这些错误。

示例代码

以下是一个简单的示例代码,展示了如何使用 cktap_transport_nfc_manager 插件。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: NFCExample(),
    );
  }
}

class NFCExample extends StatefulWidget {
  [@override](/user/override)
  _NFCExampleState createState() => _NFCExampleState();
}

class _NFCExampleState extends State<NFCExample> {
  final nfcManager = CKTapTransportNfcManager();
  String? tagData;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('NFC Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(tagData ?? "No NFC Data"),
            ElevatedButton(
              onPressed: _startNfcSession,
              child: Text("Start NFC Session"),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> _startNfcSession() async {
    bool isNfcSupported = await nfcManager.isNfcSupported();
    if (!isNfcSupported) {
      print("NFC is not supported");
      return;
    }

    await nfcManager.startSession(
      onDiscovered: (NfcTag tag) async {
        setState(() {
          tagData = "Tag ID: ${tag.id}";
        });
        // 读取标签数据
        String? data = await nfcManager.readTag();
        setState(() {
          tagData = data ?? "Failed to read tag data";
        });
      },
      onError: (NfcError error) {
        print("NFC Error: ${error.message}");
      },
    );
  }

  [@override](/user/override)
  void dispose() {
    nfcManager.stopSession();
    super.dispose();
  }
}
回到顶部