绝大多数情况下不能。uni-app 无 NFC 卡模拟能力,安卓系统限制加密门禁卡(如 Mifare Classic)模拟,仅支持读取纯 UID 卡或可写标签,真模拟需原生开发或换技术栈。
uni-app 能不能模拟门禁卡?先说结论
绝大多数情况下,不能。uni-app 本身不提供 nfc 卡模拟(card emulation)能力,安卓系统层面也对“模拟 mifare classic 等加密门禁卡”做了严格限制——除非设备已 root,或使用特定厂商开放的 se(安全单元)/ ese 接口,否则普通 app 无法写入或模拟带密钥认证的卡片。
为什么 NfcAdapter 的 enableReaderMode 和 enableForegroundDispatch 都不等于“能模拟”
这两个 API 是用来读取靠近的标签,或让 App 在前台优先响应 NFC 事件,它们和“把自己的手机变成一张卡”是两套完全不同的底层机制。模拟需要进入 Host-based Card Emulation (HCE) 或依赖硬件安全模块(如 Secure Element),而 uni-app 的 JS 层无法直接调用 HostApduService 或与 eSE 通信。
-
enableForegroundDispatch只是抢“读卡权”,不是“发卡权” - HCE 模拟的是 ISO/IEC 7816-4 标准的 AID 卡(如交通卡、部分门禁逻辑),但 Mifare Classic 的 UID+扇区密钥体系不在 HCE 支持范围内
- 即使你用
plus.android手动调起HostApduService,也无法绕过 Android 对 Mifare Classic 密钥操作的屏蔽
哪些门禁卡类型在 uni-app 里“有戏”?
只有两类可能落地,且都不涉及模拟,而是“替代验证流程”:
-
纯 UID 识别型门禁:后台把卡号(UID)存为白名单,设备仅需用 uni-app 读出 UID 并上报校验。此时用
NfcAdapter.getDefaultAdapter+TECH_DISCOVERED监听即可,支持android.nfc.tech.NfcA -
NDEF 格式可写标签:用 NTAG213/215 等标签预置 URL 或文本,uni-app 读取后跳转页面或触发动作。可用
plus.nfc.read(HBuilderX 内置)或插件如uni-nfc实现
注意:Mifare Classic 1K 卡若启用了密钥保护(99% 的门禁卡都启用),uni-app 连读 UID 都会被拒绝——系统返回 TagException 或空数据,这不是代码问题,是安卓 ROM 层面的硬限制。
真要走“模拟路线”,你得换技术栈
如果客户明确要求“手机变卡”,别在 uni-app 里硬扛。可行路径只有两条:
- 用原生 Android 开发
HostApduService,并申请 Google Play 特殊权限(仅限特定场景如交通卡),再通过uni.requireNativePlugin封装成 uni-app 插件供 JS 调用 - 改用鸿蒙或 iOS 原生方案:鸿蒙支持
ohos.nfc的部分模拟能力;iOS 仅开放 Express Transit(交通卡)和少量企业授权场景,普通门禁卡仍不可行
最后提醒一句:很多所谓“uni-app 模拟门禁卡”的教程,实际演示的是读 UID 后联网比对,然后 UI 上显示“开门成功”——这本质是伪模拟,真正刷卡动作仍在物理卡上完成。别被标题骗了。










