安卓真机上plus.nfc无反应,主因是未启用前台调度机制、缺少NFC权限及硬件特性声明、NFC开关关闭或非前台运行;需调用plus.nfc.startNdefDispatch()并确保屏幕常亮、App在前台、NFC已开启。

安卓真机上 plus.nfc 为什么完全没反应?
不是代码写错了,大概率是权限或调度机制没配对。uni-app 的 NFC 能力依赖 HBuilderX 封装的 plus.nfc API,但它底层走的是 Android 原生的 Foreground Dispatch 流程——也就是说,**只有当前应用在前台、且已主动注册监听,系统才会把 NFC 事件发给你**。后台、锁屏、切到其他 App,统统收不到。
- 必须在
manifest.json的"app-plus" → "distribute" → "android"下补全权限和特性:"permissions": ["<uses-permission android:name='\"android.permission.NFC\"/'>"]</uses-permission>,还要加"usesFeatures": ["android.hardware.nfc"] - 不能只靠
plus.nfc.onNdefMessage就完事,得先调用plus.nfc.startNdefDispatch()(部分旧版 HBuilderX 需手动触发),否则系统根本不会把标签数据路由给你的页面 - 真机测试时,屏幕必须亮着、App 必须在前台、NFC 设置已开启——三者缺一不可。很多“没反应”其实是手机 NFC 开关被关了,或者误点了“仅限支付使用”
plus.nfc.getCachedNdefMessage() 能读 UID 吗?
不能。这个接口只返回上一次成功解析的 NDEF 消息内容(比如文本、URL),而 UID 是 NFC 标签底层的物理标识,属于防冲突阶段的响应数据,不在 NDEF 协议层。想拿 UID,必须绕过 NDEF,直接跟 tag 对话。
- 安卓原生里要调
tag.getId(),但plus.nfcAPI 没暴露这个能力 - 可行解是引入原生插件:比如插件市场里的
uni-app-nfc,它封装了getTagId()方法;或自己用uni.requireNativePlugin('nfc')调用自定义模块 - 注意 NTAG213/215/216 这类常见标签,UID 是 7 字节;MIFARE Classic 1K 是 4 字节;部分国产标签可能返回空或乱码——别硬解,先用 NFC Tools 确认标签真实 UID 长度和格式
写入失败报错 java.lang.SecurityException: Permission Denial
这是 Android 9+(API 28)开始的硬性限制:写入 NFC 标签需要 android.permission.WRITE_TAG 权限,但 uni-app 的 manifest.json 不支持直接声明该权限(它被系统标记为 signature 级别)。所以即使你写了,打包后也无效。
- 解决方案只有两个:要么改用原生插件(如
uni-app-nfc内部已处理该权限申请逻辑),要么放弃纯plus.nfc.writeNdefMessage(),改用plus.nfc.formatTag()+writeNdefMessage()组合(部分机型兼容性更好) - 写入前务必确认标签可写:有些标签出厂即锁定(如部分门禁卡)、或已被写保护。用 NFC Tools 先试写一个“Hello”看是否报
TagReadOnlyException - payload 编码必须严格:文本记录要带语言码头(
[0x02, 0x65, 0x6E, 0x48, 0x65, 0x6C, 0x6C, 0x6F]),少一个字节就写入失败,错误提示却很模糊
iOS 和微信小程序的 NFC 能力差异有多大?
几乎不通用。iOS 的 CoreNFC 只允许读取 NDEF 格式标签,且必须在前台主动调起会话(NFCReaderSession),无法常驻监听;微信小程序更狠,只开放了 wx.readNFCPassiveTarget(),且仅支持 ISO14443-4A/B 类型,MIFARE Classic、NTAG21x 全部不认。
- uni-app 里必须用条件编译:
#ifdef APP-PLUS && (MP-WEIXIN || APP-PLUS)分开写逻辑,不能共用一套plus.nfc代码 - iOS 需在
manifest.json的"mp-weixin"和"app-plus"下分别配置nfcReaderUsageDescription和NSNFCReaderUsageDescription,否则直接 crash - 微信小程序写入功能至今未开放,读卡也要求用户手动点“开始识别”,体验断层明显——别指望“碰一碰自动触发”

















