plus.nfc.read仅能读取NDEF格式标签,对门禁卡、白卡等非NDEF标签无效;需先调用startNdefDispatch(安卓)或uni.readNdefMessage(iOS),且受系统限制;真正读原始数据须绕过该API,安卓走tech层手动通信,iOS仅支持用户触发的NDEF读取。

plus.nfc.read 不能直接读取任意 NFC 标签的数据内容,尤其不是 NDEF 格式的内容——它只尝试解析 NDEF 消息,对门禁卡、白卡、身份证芯片等非 NDEF 标签完全无效。
plus.nfc.read 为什么经常返回空或报错
- 它依赖系统自动识别并封装成
NdefMessage,但很多标签(如 MIFARE Classic 1K、NTAG213、国产白卡)根本没写 NDEF 结构,甚至压根没格式化; - 即使标签有 NDEF,
plus.nfc.read也要求:- 当前页面已调用
plus.nfc.startNdefDispatch()(安卓)或用户主动触发uni.readNdefMessage()(iOS); - 标签必须在前台、屏幕常亮、NFC 开关开启;
- iOS 仅支持 NDEF 文本/URI 类型,不支持自定义二进制或扇区读取;
- 当前页面已调用
- 常见错误现象:
undefined、null、"no ndef message"、长时间无回调。
怎么真正读到标签里的原始数据(比如文本、URL、自定义二进制)
-
安卓平台:必须绕过
plus.nfc.read,走原生 tech 层通信:- 从 Intent 中提取
android.nfc.extra.TAG; - 调用
tag.getId()获取 UID(非内容); - 用
android.nfc.tech.NfcA/NfcB/MifareClassic等具体技术类连接 tag; - 手动发送 APDU 或 sector read 指令(例如 MIFARE Classic 的
transceive());
- 从 Intent 中提取
-
iOS 平台:只能读 NDEF,且必须由用户点击触发:
- 调用
uni.readNdefMessage(),不能自动监听; - 返回的
res.messages是数组,每个元素含tnf、type、payload(十六进制字符串); -
payload需按 NDEF 规范解包,常见文本类型需跳过前 3 字节头再转 UTF-8。
- 调用
用插件替代原生裸调更实际
-
uni-app-nfc(插件市场)提供getTagId()和readNdef(),封装了 tech 切换逻辑,兼容 NTAG/MIFARE; - 专用证卡插件(如
CSHT-ReadCard)可直读身份证、护照芯片,但需配置服务器地址、证件号、有效期等参数; - 自研原生插件时注意:Android 9+ 写入需
WRITE_TAG权限(signature 级),无法在 manifest 声明,必须由插件内部处理。
真实读取过程里最容易被忽略的是:你拿到的“数据”到底是 NDEF payload、UID、还是某个扇区的 raw bytes?三者来源不同、用途不同、权限和 API 完全不互通。别指望一个函数通吃——先用 NFC Tools 确认标签类型和数据结构,再选对应路径。


















