You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:15:29