Flutter NFC功能插件mdd_nfc_kit的使用

Flutter NFC功能插件mdd_nfc_kit的使用

概述

mdd_nfc_kit 是一个用于在 Android、iOS 和浏览器上实现 NFC 功能的 Flutter 插件。它支持多种 NFC 标签类型,并提供了读取和写入 NDEF 记录的功能。此外,该插件还允许通过原始命令与智能卡等设备进行通信。


支持的功能:

  • 读取和写入符合以下标准的标签/卡的元数据和 NDEF 记录:
    • ISO 14443 Type A/B(NFC-A/NFC-B/MIFARE Classic/Plus/Ultralight/DESFire)
    • ISO 18092(NFC-F/FeliCa)
    • ISO 15963(NFC-V)
  • 使用符合以下标准的标签/卡发送原始命令:
    • ISO 7816 智能卡(APDUs 层 4)
    • 其他设备支持的技术(原始命令层 3)

注意:由于 API 限制,并非所有操作在两个平台上都受支持。

该库使用了 ndef 库来处理 NDEF 记录的编码和解码。


设置

感谢插件 nfc_manager 提供这些说明。

Android

  1. AndroidManifest.xml 中添加以下权限:
    <uses-permission android:name="android.permission.NFC" />
    

iOS

  1. 在 entitlements 文件中添加以下权限:
    com.apple.developer.nfc.readersession.formats
    
  2. Info.plist 中添加以下键值对:
    <key>NFCReaderUsageDescription</key>
    <string>需要 NFC 功能以完成此操作。</string>
    
    <key>com.apple.developer.nfc.readersession.felica.systemcodes</key>
    <array>
        <!-- 添加所需的系统代码 -->
    </array>
    <key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
    <array>
        <!-- 添加所需的 SELECT 命令标识符 -->
    </array>
    
    警告:对于 iOS 14.5 及更早版本,在启用 readIso18092readIso15693 的情况下调用 poll 之前,必须提前添加上述键值对,否则 NFC 将在重启前完全不可用(参见 GitHub Issue)。
  3. 打开 Runner.xcworkspace 并导航到项目设置,选择 Signing & Capabilities,然后点击左上角的 + Capability,选择 Near Field Communication Tag Reading

Web

该插件的 Web 版本实际上并不支持浏览器中的 NFC 功能,而是通过特定的 WebUSB 协议,使得 Flutter 程序能够以平台无关的方式与双接口(NFC/USB)设备通信。

确保你理解上述声明和协议后再使用此插件。


使用示例

以下是一个简单的示例代码:

import 'package:mdd_nfc_kit/mdd_nfc_kit.dart';
import 'package:ndef/ndef.dart' as ndef;

void main() async {
  // 检查 NFC 是否可用
  var availability = await FlutterNfcKit.nfcAvailability;
  if (availability != NFCAvailability.available) {
    print("NFC 不可用!");
    return;
  }

  // 开始扫描 NFC 标签
  var tag = await FlutterNfcKit.poll(
    timeout: Duration(seconds: 10), // 超时时间仅适用于 Android
    iosMultipleTagMessage: "发现多个标签!", // iOS 多标签提示消息
    iosAlertMessage: "扫描您的标签", // iOS 扫描提示消息
  );

  print("扫描到的标签: ${jsonEncode(tag)}");

  // 如果标签支持 ISO 7816
  if (tag.type == NFCTagType.iso7816) {
    // 发送 APDU 命令
    var result = await FlutterNfcKit.transceive(
      "00B0950000", // APDU 命令
      Duration(seconds: 5), // 超时时间
    );
    print("命令结果: $result");
  }

  // iOS 仅限:动态设置提示消息
  await FlutterNfcKit.setIosAlertMessage("扫描成功!");

  // 如果标签支持 NDEF 读取
  if (tag.ndefAvailable) {
    // 解码后的 NDEF 记录
    print("解码的 NDEF 记录:");
    for (var record in await FlutterNfcKit.readNDEFRecords(cached: false)) {
      print(record.toString());
    }

    // 原始 NDEF 记录(十六进制字符串)
    print("原始 NDEF 记录:");
    for (var record in await FlutterNfcKit.readNDEFRawRecords(cached: false)) {
      print(jsonEncode(record).toString());
    }
  }

  // 如果标签支持 NDEF 写入
  if (tag.ndefWritable) {
    // 写入解码后的 NDEF 记录
    await FlutterNfcKit.writeNDEFRecords([
      new ndef.UriRecord.fromUriString("https://github.com/nfcim/mdd_nfc_kit")
    ]);

    // 写入原始 NDEF 记录
    await FlutterNfcKit.writeNDEFRawRecords([
      new NDEFRawRecord("00", "0001", "0002", "0003", ndef.TypeNameFormat.unknown)
    ]);
  }

  // 结束 NFC 会话
  await FlutterNfcKit.finish();

  // iOS 仅限:结束时显示提示信息
  await FlutterNfcKit.finish(iosAlertMessage: "操作成功");
  // 或者
  await FlutterNfcKit.finish(iosErrorMessage: "操作失败");
}

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

1 回复

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


mdd_nfc_kit 是一个用于在 Flutter 应用中实现 NFC 功能的插件。它允许你读取和写入 NFC 标签,并处理 NFC 相关的操作。以下是如何在 Flutter 项目中使用 mdd_nfc_kit 插件的详细步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  mdd_nfc_kit: ^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" />

<application>
    <activity>
        <!-- 其他配置 -->
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.nfc.action.TECH_DISCOVERED" />
        </intent-filter>
        <meta-data
            android:name="android.nfc.action.TECH_DISCOVERED"
            android:resource="@xml/nfc_tech_filter" />
    </activity>
</application>

res/xml/nfc_tech_filter.xml 文件中定义支持的 NFC 技术:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
</resources>

iOS

Info.plist 文件中添加以下配置:

<key>NFCReaderUsageDescription</key>
<string>We need access to NFC to read tags.</string>

3. 使用 mdd_nfc_kit 插件

初始化 NFC

在你的 Dart 代码中,首先需要初始化 NFC 功能。

import 'package:mdd_nfc_kit/mdd_nfc_kit.dart';

void initNFC() async {
  bool isAvailable = await MddNfcKit.isAvailable();
  if (isAvailable) {
    print("NFC is available on this device.");
  } else {
    print("NFC is not available on this device.");
  }
}

读取 NFC 标签

你可以使用 MddNfcKit 来读取 NFC 标签。

void readNFC() async {
  try {
    MddNfcKit.startSession(
      onDiscovered: (NfcTag tag) async {
        print("Tag discovered: ${tag.id}");
        // 处理标签数据
        MddNfcKit.stopSession();
      },
      onError: (NfcError error) {
        print("Error: ${error.message}");
      },
    );
  } catch (e) {
    print("Error: $e");
  }
}

写入 NFC 标签

你也可以使用 MddNfcKit 来写入 NFC 标签。

void writeNFC() async {
  try {
    MddNfcKit.startSession(
      onDiscovered: (NfcTag tag) async {
        print("Tag discovered: ${tag.id}");
        // 写入数据到标签
        await MddNfcKit.writeNdefMessage("Hello, NFC!");
        MddNfcKit.stopSession();
      },
      onError: (NfcError error) {
        print("Error: ${error.message}");
      },
    );
  } catch (e) {
    print("Error: $e");
  }
}

4. 处理 NFC 数据

你可以根据需要对读取到的 NFC 数据进行处理。例如,解析 NDEF 消息:

void handleNfcTag(NfcTag tag) {
  if (tag.ndef != null) {
    for (var record in tag.ndef!.records) {
      print("Record type: ${record.type}");
      print("Record payload: ${record.payload}");
    }
  }
}

5. 停止 NFC 会话

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

MddNfcKit.stopSession();

6. 处理错误

在使用 NFC 功能时,可能会遇到各种错误,例如设备不支持 NFC、用户未授权等。你可以通过 onError 回调来处理这些错误。

MddNfcKit.startSession(
  onDiscovered: (NfcTag tag) {
    // 处理标签
  },
  onError: (NfcError error) {
    print("Error: ${error.message}");
  },
);
回到顶部