html本身不能直接做nfc读写,需依赖浏览器web nfc api,仅android chrome v117+稳定支持,须https/localhost环境及用户手势触发,仅支持ndef标签(如ntag213),ios完全不支持。

HTML 本身不能直接做 NFC 读写——NFC 功能由浏览器通过 Web NFC API 暴露,且目前仅 Chromium 内核的桌面版 Chrome(v89+)和 Android Chrome(v117+)部分支持,iOS / Safari 完全不支持。
Web NFC 只能在安全上下文 + 用户手势触发下使用
必须满足两个硬性条件才能调用 navigator.nfc:
- 页面运行在
https://或localhost(http://域名下会直接报SecurityError) - 所有 NFC 操作(如
watch()、write())必须由用户显式交互触发,比如click、tap事件,不能在load或定时器里自动执行 - Android Chrome 还要求用户已在系统设置中开启 NFC,并授予网站“NFC”权限(首次调用时会弹出授权提示)
watch() 是唯一可用的监听方式,不能主动轮询
Web NFC API 不提供“扫描一次就返回”的同步接口;watch() 是持续监听,直到调用 abort() 或页面卸载。常见错误是以为它像 read() 那样只读一次:
const controller = new AbortController();
navigator.nfc.watch(
{ type: "any" },
(message) => {
console.log("收到 NDEF 记录:", message.records);
},
{ signal: controller.signal }
);
// 必须手动终止,否则一直监听
// controller.abort();
注意:type: "any" 表示监听所有 NDEF 格式卡片;若只读文本,可用 type: "text",但兼容性更差。
write() 仅支持 NDEF 格式,且目标设备需处于可写状态
不能写任意二进制数据或低层指令(如 UID、ATQA),只能写标准 NDEF 消息:
- 写入前需构造
NDEFMessage实例,包含一个或多个NDEFRecord - 卡片必须是未锁定、支持 NDEF 的 Type 4(如 NTAG213/215/216)或 Type 2(MIFARE Ultralight)标签
- 写入失败常见原因:
NotAllowedError(没用户手势)、SecurityError(非 HTTPS)、AbortError(用户中途移开卡片)、NotSupportedError(卡片不兼容或已满)
简单写文本示例:
button.addEventListener("click", async () => {
try {
await navigator.nfc.write(new NDEFMessage([
new NDEFRecord({
recordType: "text",
data: "Hello from Web NFC!"
})
]));
} catch (err) {
console.error("写入失败:", err.name); // 如 "NotAllowedError"
}
});
真机调试必须用 Android Chrome + 开启实验性功能
桌面 Chrome 虽有 navigator.nfc,但实际无法连接 NFC 硬件(无驱动支持)。真正可用场景只有:
- Android 手机 / 平板,安装 Chrome Beta 或 Stable v117+
- Chrome 地址栏输入
chrome://flags/#web-nfc,确保Web NFC设为Enabled - 系统设置 → 连接 → NFC 开关打开,且“Android Beam”或“分享快捷方式”类功能不影响 Web NFC
- 用 USB 连接电脑后,
chrome://inspect可远程调试页面,但日志需看手机 Chrome 的 DevTools Console
最易被忽略的一点:很多便宜 NFC 标签(尤其是白牌 NTAG213)出厂未格式化为 NDEF,或写保护已启用——这类标签在 Web NFC 下表现为“不可写”或根本不出现在 watch() 回调里,换一张官方 Demo 卡测试才能确认是代码问题还是硬件问题。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











