更新记录
1.2.2(2026-03-13)
一、NDEF 写入、Mifare Classic 写块、Mifare Ultralight 写页
1.2.1(2026-03-03)
一、skipNdefCheck修改
1.2.0(2026-01-30)
新增 HarmonyOS 平台支持
查看更多
平台兼容性
uni-app(4.66)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-vue插件版本 |
app-nvue |
app-nvue插件版本 |
Android |
Android插件版本 |
iOS |
iOS插件版本 |
鸿蒙 |
鸿蒙插件版本 |
| - |
- |
- |
- |
√ |
1.0.0 |
√ |
1.0.0 |
4.4 |
1.2.2 |
12 |
1.2.2 |
12 |
1.2.2 |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| - |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(4.66)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| - |
- |
- |
- |
- |
- |
UTS环境兼容性
hl-nfccase-uts
使用说明
本插件用于 NFC 读写,支持 Android、iOS 和 HarmonyOS 平台。
Android 平台
- App 在前台时,通过回调实时拿到 NFC 数据
- 支持多种 NFC 技术类型(NDEF、Mifare、ISO-DEP、NFC-A/B/F/V 等)
- 支持高级读操作(读块、transceive 等)
- 支持写操作(NDEF 写入、MifareClassic 写块、MifareUltralight 写页、NdefFormatable 格式化写入)
- 支持 NfcA / NfcB 原始帧收发(raw transceive)
iOS 平台
- 使用 CoreNFC 框架实现多格式 NFC 标签读取
- 支持 ISO14443(MiFare、ISO7816 智能卡)和 ISO15693(NFC-V)
- 需要用户主动触发(点击按钮),不支持后台/冷启动唤醒
- 系统要求:iOS 13.0+,iPhone 7 及以上设备
HarmonyOS 平台
- 使用 @ohos.nfc.tag 和 @ohos.nfc.controller 实现 NFC 标签读取
- 支持多种 NFC 技术类型(NDEF、MiFare Classic/Ultralight、IsoDep、NFC-A/B/F/V)
- 需要调用
startNFCSession() 启动前台调度
- 系统要求:HarmonyOS 3.0+
支持的标签/技术类型
Android 平台
| 技术类型 |
说明 |
| NDEF |
NFC Forum Type 1-5(常见 Ndef/NdefFormatable) |
| Mifare Classic |
1K/4K |
| Mifare Ultralight |
轻量级标签 |
| ISO-DEP |
ISO14443-4 |
| NFC-A / NFC-B / NFC-F / NFC-V |
全部支持 |
iOS 平台
| 协议 |
标签类型 |
应用场景 |
| ISO14443 |
MiFare(Ultralight、Plus、DESFire)、ISO7816 智能卡 |
门禁卡、银行卡、交通卡 |
| ISO15693 |
NFC-V |
工业标签、图书馆标签 |
注意:iOS 不支持 FeliCa (ISO18092),该协议主要用于日本市场。
HarmonyOS 平台
| 技术类型 |
说明 |
| NDEF |
NFC Forum Type 1-5 |
| Mifare Classic |
1K/4K(支持读块操作) |
| Mifare Ultralight |
轻量级标签 |
| ISO-DEP |
ISO14443-4(支持 APDU) |
| NFC-A / NFC-B / NFC-F / NFC-V |
全部支持 |
平台差异对比
| 特性 |
Android |
iOS |
HarmonyOS |
| 启动方式 |
自动监听 |
需调用 startNFCSession() |
需调用 startNFCSession() |
| 系统弹窗 |
无 |
有 |
无 |
| FeliCa 支持 |
✅ 支持 |
❌ 不支持 |
✅ 支持 |
| Mifare Classic 读块 |
✅ 支持 |
❌ 不支持 |
✅ 支持 |
| NDEF 写入 |
✅ 支持 |
❌ 不支持 |
✅ 支持 |
| Mifare Classic 写块 |
✅ 支持 |
❌ 不支持 |
✅ 支持 |
| Mifare Ultralight 写页 |
✅ 支持 |
❌ 不支持 |
✅ 支持 |
| NdefFormatable 格式化 |
✅ 支持 |
❌ 不支持 |
❌ 不支持 |
| NfcA/NfcB Raw Transceive |
✅ 支持 |
❌ 不支持 |
❌ 不支持 |
| 最低系统版本 |
Android 5.0+ |
iOS 13.0+ |
HarmonyOS 3.0+ |
说明:默认返回“识别信息 + NDEF 文本/URI(如有)”。不默认读取 Mifare 块数据(需要密钥/认证策略,且容易因卡不同而失败)。
示例
uni-app x 调用示例(Vue 3 Composition API)
<template>
<view class="container">
<button @click="startScan">开始扫描 NFC</button>
<button @click="stopScan">停止扫描</button>
<view v-if="tagData">
<text>UID: {{ tagData.uidHex }}</text>
<text>NDEF: {{ tagData.ndefText || tagData.ndefUri }}</text>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue'
import { onShow, onHide } from '@dcloudio/uni-app'
import {
onTagDiscovered,
startNFCSession,
stopNFCSession,
isNfcSupported,
configure
} from '@/uni_modules/hl-nfccase-uts'
const tagData = ref(null)
// 启动扫描
const startScan = () => {
// 注册回调
onTagDiscovered((event) => {
console.log('NFC 标签:', event)
tagData.value = event
})
// iOS/HarmonyOS 需要手动启动
// #ifdef APP-IOS || APP-HARMONY
startNFCSession()
// #endif
}
// 停止扫描
const stopScan = () => {
// #ifdef APP-IOS || APP-HARMONY
stopNFCSession()
// #endif
}
onShow(() => {
configure({ pendingMax: 10, dedupeMs: 600 })
})
onHide(() => {
stopScan()
})
</script>
uni-app 调用示例(Options API)
<template>
<view class="container">
<button @click="startScan">开始扫描 NFC</button>
<button @click="stopScan">停止扫描</button>
<view v-if="tagData">
<text>UID: {{ tagData.uidHex }}</text>
</view>
</view>
</template>
<script>
import {
onTagDiscovered,
startNFCSession,
stopNFCSession,
isNfcSupported,
configure
} from '@/uni_modules/hl-nfccase-uts'
export default {
data() {
return {
tagData: null
}
},
onShow() {
configure({ pendingMax: 10, dedupeMs: 600 })
},
onHide() {
this.stopScan()
},
methods: {
startScan() {
// 注册回调
onTagDiscovered((event) => {
console.log('NFC 标签:', event)
this.tagData = event
})
// iOS/HarmonyOS 需要手动启动
// #ifdef APP-IOS || APP-HARMONY
startNFCSession()
// #endif
},
stopScan() {
// #ifdef APP-IOS || APP-HARMONY
stopNFCSession()
// #endif
}
}
}
</script>
平台特定调用示例
1) Android 前台监听(自动)
import { onTagDiscovered } from '@/uni_modules/hl-nfccase-uts'
// Android 无需调用 startNFCSession,注册回调后自动监听
onTagDiscovered((event) => {
console.log('NFC event:', event)
// event.uidHex / event.techs / event.ndefText / event.ndefUri / event.extras ...
})
2) iOS/HarmonyOS 手动启动扫描
import { startNFCSession, stopNFCSession, onTagDiscovered } from '@/uni_modules/hl-nfccase-uts'
// 先注册回调
onTagDiscovered((event) => {
console.log('NFC 标签:', event)
})
// 再启动扫描
startNFCSession()
// 页面隐藏时停止
stopNFCSession()
4) 判断 NFC 状态
import { isNfcSupported, isNfcEnabled } from '@/uni_modules/hl-nfccase-uts'
console.log('supported:', isNfcSupported())
console.log('enabled:', isNfcEnabled())
注意事项
Android 平台
- 必须制作自定义基座/重新打包:因为本插件新增了 AndroidManifest(NFC intent-filter)用于后台唤起。
- Android 12+ 要求:带 intent-filter 的 Activity 必须设置
android:exported="true"(插件已处理)。
- 后台碰卡时,系统会先启动插件内置的
NfcDispatchActivity 缓存数据,再拉起主界面;页面跳转逻辑放在前端实现(例如在 onShow 里读取 getPendingTagSync(true) 后跳转)。
iOS 平台
- 必须配置 Info.plist 权限:添加
NFCReaderUsageDescription 权限说明。
- 必须启用 NFC Capability:在 Xcode 中添加
Near Field Communication Tag Reading capability。
- 必须配置 Entitlements:添加
com.apple.developer.nfc.readersession.formats 包含 NDEF 和 TAG。
- 系统要求:iOS 13.0+ 和支持 NFC 的设备(iPhone 7+)。
- 不支持后台唤醒:必须由用户主动点击按钮启动 NFC 扫描。
- 支持多种标签:MiFare、ISO7816、ISO15693 (NFC-V),不支持 FeliCa。
- Mifare 读写限制:不支持 Mifare Classic 直接读块/扫区(需通过 ISO7816 APDU)。
HarmonyOS 平台
- 必须配置权限:在 module.json5 中添加
ohos.permission.NFC_TAG 权限。
- 系统要求:HarmonyOS 3.0+ 和支持 NFC 的设备。
- 需要手动启动:调用
startNFCSession() 启动前台调度。
- 支持 Mifare 读写:支持 MiFare Classic/Ultralight 的读写操作。
API 参考
基础能力
| 方法 |
平台 |
说明 |
onTagDiscovered(callback) |
全平台 |
注册 NFC 标签发现回调 |
startNFCSession() |
iOS/HarmonyOS |
启动 NFC 扫描会话 |
stopNFCSession() |
iOS/HarmonyOS |
停止 NFC 扫描会话 |
getPendingTagSync(clearRead) |
全平台 |
同步获取缓存的 NFC 数据 |
getPendingTagsSync(clearRead, max) |
全平台 |
获取多个缓存的 NFC 数据 |
clearPendingTag() |
全平台 |
清除缓存的 NFC 数据 |
isNfcSupported() |
全平台 |
判断设备是否支持 NFC |
isNfcEnabled() |
全平台 |
判断 NFC 是否已启用 |
configure(options) |
全平台 |
配置插件参数 (如 skipNdefCheck) |
读操作
| 方法 |
平台 |
说明 |
mifareClassicReadSector(sector, keyType, keyHex) |
Android/HarmonyOS |
读取 MiFare Classic 扇区 |
mifareClassicReadBlock(block, keyType, keyHex) |
Android/HarmonyOS |
读取 MiFare Classic 块 |
mifareUltralightReadPages(startPage, pageCount) |
Android/HarmonyOS |
读取 MiFare Ultralight 页 |
isoDepTransceive(apduHex) |
Android/HarmonyOS |
IsoDep 发送 APDU 命令 |
nfcVTransceive(cmdHex) |
Android/HarmonyOS |
NfcV 发送原始命令 |
nfcATransceive(cmdHex) |
Android |
NfcA 原始帧收发 |
nfcBTransceive(cmdHex) |
Android |
NfcB 原始帧收发 |
写操作
| 方法 |
平台 |
说明 |
ndefWrite(records) |
Android/HarmonyOS |
写入 NDEF 消息(覆盖现有内容) |
ndefFormatAndWrite(records) |
Android |
将空白卡格式化为 NDEF 并写入初始消息 |
mifareClassicWriteBlock(block, keyType, keyHex, dataHex) |
Android/HarmonyOS |
写入 MiFare Classic 块(16字节) |
mifareUltralightWritePage(page, dataHex) |
Android/HarmonyOS |
写入 MiFare Ultralight 页(4字节) |
写入操作示例(Android / HarmonyOS)
1) 写入 NDEF 消息
import { ndefWrite, onTagDiscovered } from '@/uni_modules/hl-nfccase-uts'
// 碰卡后自动触发(Android 无需手动启动)
onTagDiscovered((event) => {
console.log('标签已扫描:', event.uidHex)
// 支持 text / uri / mime / external / raw 五种类型
const res = ndefWrite([
{ type: 'text', data: 'Hello NFC', lang: 'en' },
{ type: 'uri', data: 'https://example.com' }
])
if (res.code === 0) {
console.log('NDEF 写入成功')
} else {
console.error('写入失败:', res.data.error)
}
})
2) 格式化空白卡并写入(Android 专属 NdefFormatable)
import { ndefFormatAndWrite, onTagDiscovered } from '@/uni_modules/hl-nfccase-uts'
onTagDiscovered((event) => {
// 格式化 + 写入初始消息
const res = ndefFormatAndWrite([
{ type: 'text', data: 'Hello NFC', lang: 'en' }
])
// 仅格式化不写内容:传空数组
// const res = ndefFormatAndWrite([])
if (res.code === 0) {
console.log('格式化+写入成功')
} else {
console.error('失败:', res.data.error)
}
})
3) 写入 MiFare Classic 块
import { mifareClassicWriteBlock } from '@/uni_modules/hl-nfccase-uts'
// 写入块 4(需要密钥认证),碰卡后 5 秒内调用
const res = mifareClassicWriteBlock(
4, // 块号(注意不要写 Sector Trailer,否则锁卡)
'A', // 密钥类型 'A' | 'B'
'FFFFFFFFFFFF', // 6 字节密钥(12 hex 字符)
'00112233445566778899AABBCCDDEEFF' // 16 字节数据(32 hex 字符)
)
if (res.code === 0) {
console.log('写入成功, block:', res.data.block)
}
4) 写入 MiFare Ultralight 页
import { mifareUltralightWritePage } from '@/uni_modules/hl-nfccase-uts'
// 写入页 4,碰卡后 5 秒内调用
const res = mifareUltralightWritePage(
4, // 页号
'00112233' // 4 字节数据(8 hex 字符)
)
if (res.code === 0) {
console.log('写入成功, page:', res.data.page)
}
5) NfcA / NfcB 原始帧收发(Android 专属)
import { nfcATransceive, nfcBTransceive } from '@/uni_modules/hl-nfccase-uts'
// NfcA 原始帧,需了解具体卡片的 ISO 14443-3 协议
const resA = nfcATransceive('6000')
if (resA.code === 0) {
console.log('NfcA 响应:', resA.data.responseHex)
}
// NfcB 原始帧
const resB = nfcBTransceive('05...')
if (resB.code === 0) {
console.log('NfcB 响应:', resB.data.responseHex)
}
返回数据结构
Android 平台
{
"timestamp": 1769741815417, // 时间戳
"action": "TECH_DISCOVERED", // 动作类型
"uidHex": "04A1B2C3D4E5F6", // 标签 UID
"techs": ["NfcA", "MifareClassic", "NdefFormatable"], // 支持的技术
"atqa": "0400", // ATQA(NfcA)
"sak": "08", // SAK(NfcA)
"ndef": { // NDEF 数据(如有)
"records": [...],
"text": "文本内容",
"uri": "https://example.com"
},
"ndefText": "文本内容",
"ndefUri": "https://example.com",
"extras": { // 额外信息
"mifareType": "Classic1K",
"mifareSize": 1024
}
}
iOS 平台
{
"timestamp": 1769741815417, // 时间戳
"action": "iOS_CoreNFC_MiFare", // 标签类型标识
"uidHex": "53318EF7210001", // 标签 UID
"techs": ["MiFare", "MiFareUnknown"], // 支持的技术
"tagType": "MiFare", // 标签类型
"mifareFamily": "MiFare Unknown", // MiFare 家族(仅 MiFare)
"ndef": { // NDEF 数据(如有)
"records": [...],
"text": null,
"uri": "https://example.com"
},
"ndefText": null,
"ndefUri": "https://example.com"
}
HarmonyOS 平台
{
"timestamp": 1769741815417, // 时间戳
"action": "Harmony_NFC_TAG", // 动作类型
"uidHex": "04A1B2C3D4E5F6", // 标签 UID
"techs": ["NfcA", "MifareClassic", "Ndef"], // 支持的技术
"atqa": "0400", // ATQA(NfcA)
"sak": "08", // SAK(NfcA)
"tagType": "MifareClassic", // 标签类型
"mifareType": "Classic", // MiFare 类型
"ndef": { // NDEF 数据(如有)
"records": [...],
"text": "文本内容",
"uri": "https://example.com"
},
"ndefText": "文本内容",
"ndefUri": "https://example.com",
"extras": { // 额外信息
"nfcA": { "atqa": "0400", "sak": 8 },
"mifareClassic": { "type": "Classic", "size": 1024, "sectorCount": 16, "blockCount": 64 }
}
}