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
- 在
AndroidManifest.xml
中添加以下权限:<uses-permission android:name="android.permission.NFC" />
iOS
- 在 entitlements 文件中添加以下权限:
com.apple.developer.nfc.readersession.formats
- 在
Info.plist
中添加以下键值对:<key>NFCReaderUsageDescription</key> <string>需要 NFC 功能以完成此操作。</string>
警告:对于 iOS 14.5 及更早版本,在启用<key>com.apple.developer.nfc.readersession.felica.systemcodes</key> <array> <!-- 添加所需的系统代码 --> </array> <key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key> <array> <!-- 添加所需的 SELECT 命令标识符 --> </array>
readIso18092
或readIso15693
的情况下调用poll
之前,必须提前添加上述键值对,否则 NFC 将在重启前完全不可用(参见 GitHub Issue)。 - 打开
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
更多关于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}");
},
);