Flutter/Android端NFC扫描如何获取与iOS端一致的标签UID
Flutter NFC读取UID与iOS端结果不一致解决方案
问题根因
Android端通过NFC-Manager包拿到的identifier字段是十进制格式的字节数组,iOS端返回的NFC标签UID是每个字节转换为两位小写十六进制字符串后直接拼接的结果。解析失败的核心原因是字节转十六进制时未对小于16的字节做前导补0处理,导致拼接结果长度、内容不匹配。
数据对应验证
扫描同一张标签拿到的identifier数组为[4, 234, 27, 114, 131, 92, 128],逐字节转换的对应关系如下:
- 4 → 04
- 234 → ea
- 27 → 1b
- 114 → 72
- 131 → 83
- 92 → 5c
- 128 → 80
逐段拼接后正好得到iOS端返回的UID:04ea1b72835c80
正确实现代码
/// 解析NFC identifier字节数组,生成与iOS端格式一致的UID字符串 String _convertIdentifierToUid(List<int> identifierBytes) { return identifierBytes // 单字节转16进制,不足两位补前导0 .map((byte) => byte.toRadixString(16).padLeft(2, '0')) // 拼接所有片段后转小写,和iOS返回格式对齐 .join() .toLowerCase(); } void _tagRead() { NfcManager.instance.startSession(onDiscovered: (NfcTag tag) async { String nfcUid = ''; // 优先取nfca节点下的identifier,对NFC-A类型标签兼容性最好 final nfcaTag = tag.data['nfca']; if (nfcaTag != null && nfcaTag['identifier'] != null) { nfcUid = _convertIdentifierToUid(List<int>.from(nfcaTag['identifier'])); } result.value = nfcUid; NfcManager.instance.stopSession(); }); }
注意:不要省略
padLeft(2, '0')补位逻辑,否则首字节这类小于16的数值转十六进制只会生成1位字符,最终拼接结果会和iOS端不一致。
内容的提问来源于stack exchange,提问作者Florian Buchfink
相关产品推荐
相关产品推荐

