更新记录
1.1.3(2026-07-22)
- 修复 HBuilderX 5.15 / 新版 Android SDK 对 Android 12 及以下
Intent.getParcelableExtra(String)兼容分支产生的 deprecated 诊断;Android 13+ 继续使用类型安全重载,两条标签解析路径及 Foreground Dispatch 行为保持不变。 - 已通过 uni-app x Android appResource 与生成 Kotlin 检查;公开 API 和调用方式保持不变。升级后需重新原生联编或重打 Android 自定义基座。
1.1.2(2026-07-15)
- 修复 iOS 云打包时
UInt8.toString(16)、stopNfcSession()缺少可选参数以及NSNumber直接传入setTimeout导致的三项 SwiftCompile 错误。 - 增加 iOS Swift 云编译兼容守卫,并完成 uni-app、uni-app x 双项目 appResource、生成 Swift 与实际云打包复验;公开 API 和调用方式保持不变。升级后需重新原生联编或重打 iOS 自定义基座。
1.1.1(2026-07-15)
- 修复 Android 云打包时
scanTagOnce清理会话未显式传入可选参数,导致生成 Kotlin 报No value passed for parameter 'options'的问题。 - 修复 Android 一次性扫描直接注册可变可空监听器,导致生成 Kotlin 报
Smart cast ... is impossible的问题;改用不可变非空监听器完成注册,并在终态安全清理。 - 增加 Android 云编译 Kotlin 兼容守卫,并完成 uni-app、uni-app x 双项目 appResource 与生成 Kotlin 复验;公开 API 和调用方式保持不变。升级后需重新原生联编或重打 Android 自定义基座。
平台兼容性
uni-app(4.84)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(4.84)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | √ | √ | √ | × |
lizhao-nfc-pro
lizhao-nfc-pro 是面向 uni-app 与 uni-app x 的三端 NFC 标签读写 UTS 插件。它把 Android、iOS、HarmonyOS 的标签发现、NDEF 读写和底层技术协议统一为 32 个 API,适合设备配网、资产巡检、电子标签、卡片识别、文本/链接交换及 ISO-DEP、NfcF、NfcV、Mifare 等业务。
当前文档对应插件版本:1.1.3。
如果你是第一次接入,请按“第 1 步”到“第 8 步”依次阅读;如果已经跑通读卡,可直接跳到“第 9 步:按需查询 32 个 API”。
阅读路线
| 你现在的目标 | 建议阅读位置 | 完成标志 |
|---|---|---|
| 判断插件是否适合项目 | 第 1~2 步 | 明确平台、标签类型和接入路线 |
| 第一次在真机读到标签 | 第 3~4 步 | 收到 onTagDiscovered 回调并取得 UID |
| 读取或写入文本、链接 | 第 5~6 步 | 能正确读取或写入 NDEF 记录 |
| 发送 APDU、操作 Mifare | 第 7 步 | 已确认技术类型、权限和指令协议 |
| 排查接入失败 | 第 8 步 | 能根据状态与 906xxxx 错误定位问题 |
| 查询完整参数 | 第 9 步及后续章节 | 找到目标 API 的参数、返回值和错误码 |
第 1 步:先判断插件是否适合你的业务
适合的场景
- Android、iOS、HarmonyOS 使用平台原生 NFC 能力,不伪造成功结果。
- 统一 32 个公开 API、统一 success / fail / complete 回调与 906xxxx 错误码。
- 支持标签发现、活动标签缓存与 TTL、NDEF 读写/格式化、原始指令和 Mifare 操作。
- Android 支持 ReaderMode 与前台分发;iOS 使用 Core NFC;HarmonyOS 使用 ReaderMode 与原生技术对象。
- 支持先发起操作、后贴标签的排队流程;会话终止、标签丢失或超时会返回明确错误。
- 同时提供 uni-app 和 uni-app x 示例,业务代码只从插件根目录导入。
不适合或不能直接承诺的场景
- Web、小程序、模拟器没有本插件所需的 App 原生 NFC 技术对象,不会返回伪造成功。
- 插件用于 NFC 标签读写,不提供银行卡支付、交通卡充值、门禁卡破解或安全芯片密钥提取能力。
- UID 只能作为标签标识之一,不能单独作为门禁授权、支付或防伪凭证。
- 不同手机和标签支持的技术类型不同;购买前应先确认目标设备、目标卡片与下方能力矩阵。
第 2 步:选择接入路线
| 业务场景 | 推荐接入方式 | 关键 API | 说明 |
|---|---|---|---|
| 只判断设备 NFC 能力 | 状态查询 | getNfcCapabilities、getNfcStatus | 不启动读卡会话 |
| 读取普通文本或链接标签 | 标准 NDEF 流程 | startNfcSession、onTagDiscovered、readNdef | 跨平台优先选择 |
| 写入文本或链接 | NDEF 构造与写入 | buildTextRecord、buildUriRecord、writeNdef | iOS 要求标签已经是可写 NDEF |
| 首次格式化空白标签 | 格式化写入 | formatAndWriteNdef | Android、HarmonyOS 支持;iOS 不支持 |
| APDU 或技术协议交互 | 原始指令 | isoDepTransceive、nfcFTransceive、nfcVTransceive | 先核对技术能力矩阵 |
| Mifare 卡片业务 | 专用 Mifare API | mifareClassic、mifareUltralight | iOS 不支持 MifareClassic |
| 一次点击完成读卡 | 一次性扫描 | scanTagOnce | 自动启动、等待、超时并清理内部会话 |
| 写入前检查标签 | NDEF 状态预检 | getNdefStatus | 先确认格式、可写性与容量,再决定是否写入 |
| 完全自定义页面 | 监听器 + 32 API | onTagDiscovered、offTagDiscovered | 插件不依赖业务 UI |
大多数项目建议先完成“标准 NDEF 读取”,确认会话、权限和标签发现链路正常,再逐步增加写入或底层协议。不要一开始就用生产卡片测试写块、格式化或未知 APDU。
第 3 步:完成接入前准备
3.1 安装与导入
- 将完整
lizhao-nfc-pro目录放入项目uni_modules。 - 使用 HBuilderX 管理和编译项目;UTS 插件不能通过
uni.requireNativePlugin或uni.xxx调用。 - 页面只能从插件根目录导入:
// 正确:从插件根目录导入公开 API。
import { getNfcStatus } from '@/uni_modules/lizhao-nfc-pro'
不要直接引用 utssdk/index.uts 或某个平台的内部文件。
3.2 准备真机与自定义基座
| 检查项 | Android | iOS | HarmonyOS |
|---|---|---|---|
| 真机要求 | 设备具有 NFC,系统 NFC 已开启 | 支持 Core NFC 的 iPhone | 设备具有 NFC 标签能力 |
| 原生配置 | NFC 权限随插件配置接入 | NFCReaderUsageDescription、NFC Tag Reading capability 和匹配描述文件 |
ohos.permission.NFC_TAG 与有效签名配置 |
| 高级协议 | 按标签技术类型使用 | ISO7816 需业务 AID;FeliCa 需 System Code | 按标签技术类型使用 |
| 运行方式 | 自定义基座或正式原生包 | 自定义基座或正式原生包 | 原生联编后的应用 |
新增插件或更新原生实现后必须重新原生联编。仅更新 wgt、appResource 或页面资源,不能把 NFC 原生代码更新进旧基座。
3.3 先做状态检查
在显示“开始读卡”按钮前,先查询设备能力与系统状态:
import { getNfcCapabilities, getNfcStatus } from '@/uni_modules/lizhao-nfc-pro'
// 能力矩阵用于控制不同平台的业务按钮是否显示。
getNfcCapabilities({
success: (capability: any): void => {
console.log('是否支持 NDEF 读取:', capability.ndefRead)
}
})
// supported 表示平台能力,nfcEnabled 表示当前系统开关状态。
getNfcStatus({
success: (status: any): void => {
console.log('NFC 状态:', status)
}
})
第 4 步:5 分钟跑通第一次读卡
第一次测试建议使用普通、可重复读取的 NDEF 标签。如果页面只需要“点击一次、读取一张标签”,优先用 scanTagOnce;需要连续读卡、监听多张标签时,再使用后面的会话模式。
4.0 最短路径:一次性扫描
import { scanTagOnce } from '@/uni_modules/lizhao-nfc-pro'
// 插件只在当前没有业务会话时启动内部会话;成功、失败或超时后都会清理资源。
scanTagOnce({
timeoutMs: 15000,
alertMessage: '请将 NFC 标签靠近设备',
success: (tag: any): void => {
console.log('标签 UID:', tag.uidHex)
},
fail: (err: any): void => {
console.error('一次扫描失败:', err)
}
})
如果当前已经存在 starting / active / stopping 会话,scanTagOnce 会返回 9060015,不会停止或覆盖客户自己的业务会话。
下面的连续会话示例只做三件事:注册标签监听、启动会话、页面退出时释放会话。
4.1 uni-app 最小示例
<template>
<view>
<button @click="startRead">开始读卡</button>
<button @click="stopRead">停止读卡</button>
</view>
</template>
<script>
import {
startNfcSession,
stopNfcSession,
onTagDiscovered,
offTagDiscovered,
readNdef
} from '@/uni_modules/lizhao-nfc-pro'
const tagListener = (tag) => {
console.log('发现 NFC 标签', tag)
// 标签进入活动时间窗后读取 NDEF;失败时保留标准错误对象。
readNdef({
success(res) {
console.log('NDEF 读取成功', res)
},
fail(err) {
console.error('NDEF 读取失败', err)
}
})
}
export default {
onLoad() {
onTagDiscovered(tagListener)
},
onUnload() {
// 必须使用注册时的同一函数引用精确退订。
offTagDiscovered(tagListener)
stopNfcSession()
},
methods: {
startRead() {
// success 只表示会话启动,发现标签要等待 tagListener。
startNfcSession({
alertMessage: '请将设备靠近 NFC 标签',
success(res) {
console.log('NFC 会话已启动', res)
},
fail(err) {
console.error('NFC 会话启动失败', err)
},
complete() {
console.log('启动调用已结束')
}
})
},
stopRead() {
stopNfcSession()
}
}
}
</script>
4.2 uni-app x 最小示例
<template>
<view>
<button @tap="startRead">开始读卡</button>
<button @tap="stopRead">停止读卡</button>
</view>
</template>
<script setup lang="uts">
import {
startNfcSession,
stopNfcSession,
onTagDiscovered,
offTagDiscovered,
readNdef,
type NfcTagInfo,
type NfcTagListener
} from '@/uni_modules/lizhao-nfc-pro'
// 保存同一监听函数引用,页面卸载时才能精确退订。
const tagListener: NfcTagListener = (tag: NfcTagInfo): void => {
console.log('发现 NFC 标签:' + tag.uidHex)
readNdef({
success: (res: any): void => {
console.log('NDEF 读取成功', res)
},
fail: (err: any): void => {
console.error('NDEF 读取失败', err)
},
complete: (_res: any): void => {
console.log('NDEF 读取调用已结束')
}
})
}
function startRead(): void {
startNfcSession({
alertMessage: '请将设备靠近 NFC 标签',
fail: (err: any): void => {
console.error('NFC 会话启动失败', err)
}
})
}
function stopRead(): void {
stopNfcSession()
}
onLoad(() => {
onTagDiscovered(tagListener)
})
onUnload(() => {
offTagDiscovered(tagListener)
stopNfcSession()
})
</script>
完整示例位于:
- uni-app:
uni_modules/lizhao-nfc-pro/example/uniapp/nfc.vue - uni-app x:
uni_modules/lizhao-nfc-pro/example/uniappx/index.uvue
4.3 第一次运行时应看到什么
startNfcSession.success触发:表示原生会话已启动,不表示已经读到卡。- 标签靠近设备后,
tagListener收到NfcTagInfo,其中uidHex是标签 UID,techs是真实技术类型。 - 标签仍在活动时间窗内时,
readNdef.success返回records、bytesHex等读取结果。 - 页面退出或业务完成后,监听器和会话被释放。
第 5 步:理解会话与标签生命周期
推荐调用顺序:
页面进入
-> configureNfc(可选)
-> onTagDiscovered(先注册监听)
-> startNfcSession(启动会话)
-> 用户贴卡
-> 标签回调内执行 NDEF 或技术指令
-> offTagDiscovered + stopNfcSession(页面退出或业务结束)
关键规则:
startNfcSession.success只代表会话启动,不代表标签已经出现。- 标签操作依赖当前会话和活动标签;会话已结束会返回
9060005,没有可用标签会返回9060006。 - 同一标签对象只在
activeTagTtlMs时间窗内有效;超时后应重新贴卡。 success与fail只会进入一个,complete无论成功失败都会触发,不能把complete当成成功。- 页面卸载时必须停止会话并注销监听,避免原生会话和业务回调残留。
5.1 增强会话流程
- 调用
configureNfc设置 ReaderMode、去重窗口、活动标签 TTL 和等待队列上限。 - 先注册
onTagDiscovered,再调用startNfcSession,避免漏掉首个标签事件。 - 标签发现回调触发后,在
activeTagTtlMs时间窗内调用readNdef、writeNdef或技术指令。 - 业务可在标签尚未贴近时先调用标签操作;Android 与 HarmonyOS 会按会话顺序等待标签,队列超过
pendingMax返回9060015。 keepSessionAlive为false时只处理一次标签;插件会保留该标签到首个操作完成或 TTL 到期,随后关闭会话。- 页面退出时先
offTagDiscovered,再stopNfcSession;会话关闭会取消尚未执行的操作。
import {
configureNfc,
buildTextRecord,
startNfcSession,
writeNdef
} from '@/uni_modules/lizhao-nfc-pro'
// 配置一次读写会话:同一卡片 800ms 内去重,标签保持 30 秒。
configureNfc({
useReaderMode: true,
keepSessionAlive: true,
activeTagTtlMs: 30000,
dedupeMs: 800,
pendingMax: 16
})
const textRecord = buildTextRecord({
text: '设备编号:A-1001',
lang: 'zh-CN'
})
startNfcSession({
success: (): void => {
// 可以等待贴卡后再执行,也可以由业务按钮提前提交到等待队列。
writeNdef({
records: [textRecord],
fail: (err: any): void => {
console.error('写入失败', err)
}
})
}
})
5.2 取消还在等标签的操作
Android 与 HarmonyOS 支持“先调用、后贴卡”的等待队列。给标签操作传入稳定的 operationId 后,可在原生 I/O 开始前精确取消:
import { cancelNfcOperation, readNdef } from '@/uni_modules/lizhao-nfc-pro'
const operationId = 'asset-read-1001'
readNdef({
operationId,
fail: (err: any): void => console.log('读取被取消或失败', err)
})
// 只取消仍在等待队列中的同名操作;已经开始的原生读写不会被强制中断。
cancelNfcOperation({
operationId,
success: (result: any): void => console.log('是否取消成功', result.cancelled)
})
iOS 不维护预贴卡等待队列,因此返回 cancelled: false;这不是异常,也不会停止当前 Core NFC 会话。
第 6 步:从读取升级到 NDEF 写入
6.1 写入前先查询 NDEF 状态
import { getNdefStatus } from '@/uni_modules/lizhao-nfc-pro'
// 先确认标签已格式化且可写,再由客户主动触发 writeNdef。
getNdefStatus({
operationId: 'check-before-write',
success: (status: any): void => {
console.log('是否可写:', status.writable)
console.log('容量与当前消息:', status.capacity, status.messageSize)
}
})
HarmonyOS 当前没有公开等价的 NDEF 容量接口,因此 capacity 返回 -1;业务只在 capacity >= 0 时做容量比较。iOS 状态查询不额外读取消息,messageSize 返回 -1。
6.2 优先使用文本和 URI 记录
普通跨平台业务优先使用 buildTextRecord、buildUriRecord 和 writeNdef,不需要自行拼接 NDEF 字节:
import { buildTextRecord, writeNdef } from '@/uni_modules/lizhao-nfc-pro'
const record = buildTextRecord({
text: '资产编号 A-1001',
lang: 'zh-CN',
encoding: 'utf-8'
})
// 请在标签发现后、活动标签 TTL 内写入。
writeNdef({
records: [record],
success: (res: any): void => {
console.log('写入成功', res)
},
fail: (err: any): void => {
console.error('写入失败', err.errCode, err.errMsg)
}
})
6.3 writeNdef 与 formatAndWriteNdef 的区别
| API | 使用条件 | 平台边界 |
|---|---|---|
writeNdef |
标签已经是 NDEF 且可写 | Android / iOS / HarmonyOS |
formatAndWriteNdef |
空白标签可被格式化 | Android / HarmonyOS;iOS 不支持通用格式化 |
首次写入请使用可恢复的测试标签,并先备份原内容。不要对门禁卡、交通卡、银行卡、生产资产卡或未知标签直接执行格式化和写入。
6.4 构造 MIME 与 External 记录
import { buildExternalRecord, buildMimeRecord } from '@/uni_modules/lizhao-nfc-pro'
// application/json 载荷为 UTF-8 十六进制;构造器本身不访问 NFC 硬件。
const mimeRecord = buildMimeRecord({
mimeType: 'application/json',
payloadHex: '7B226F6B223A747275657D'
})
const externalRecord = buildExternalRecord({
domain: 'example.com',
type: 'device',
payloadHex: '6C697A68616F'
})
6.5 验证 NDEF 解析器
以下十六进制是一个合法的 Hello 英文文本记录,可用于验证 Android / iOS / HarmonyOS 的原始 NDEF 解析:
import { parseNdefMessage } from '@/uni_modules/lizhao-nfc-pro'
const parsed = parseNdefMessage({
rawMessageHex: 'D101085402656E48656C6C6F'
})
console.log(parsed.firstText) // Hello
Android、iOS、HarmonyOS 都会尝试使用平台 NDEF 解析器处理 rawMessageHex;非法输入会回退为公共结构化结果。
第 7 步:按标签技术类型使用高级能力
高级指令不是通用读卡接口。先从 NfcTagInfo.techs 和 getNfcCapabilities 确认技术类型,再根据卡片厂商协议生成命令。
| 标签或协议 | 推荐 API | 接入前必须确认 |
|---|---|---|
| ISO-DEP / ISO 7816 | isoDepTransceive |
APDU 协议、AID、状态字;iOS 描述文件与 AID 配置 |
| NfcF / FeliCa | nfcFTransceive |
System Code、服务码、命令格式 |
| NfcV / ISO 15693 | nfcVTransceive |
requestFlags、commandCode、寻址方式 |
| NfcA / NfcB | nfcATransceive / nfcBTransceive |
Android/HarmonyOS 原始协议;iOS 不开放通用 raw transceive |
| MifareClassic | mifareClassic* |
Android/HarmonyOS、扇区、块、Key A/B、访问位 |
| MifareUltralight | mifareUltralight* |
页范围、锁定位、配置页与 4 字节写入长度 |
生产密钥、AID、卡片个人数据和完整 APDU 不应写入页面、README 或日志。插件只负责传输与结构化错误,不替代业务协议和安全设计。
第 8 步:按顺序排查常见问题
| 现象 | 优先检查 | 处理建议 |
|---|---|---|
| 页面能运行,但 API 不存在或没有原生日志 | 是否仍在使用标准基座/旧基座 | 重新原生联编或重打自定义基座,仅更新页面资源无效 |
supported: false |
当前是否为 Web、小程序、模拟器或无 NFC 设备 | 切换到支持 NFC 的 App 真机 |
nfcEnabled: false |
Android/HarmonyOS 系统 NFC 开关 | 引导用户打开系统 NFC;Android 可调用 openNfcSettings |
9060003 permission denied |
iOS Capability/描述文件、HarmonyOS 权限、系统授权 | 对照平台配置重新签名和安装 |
9060005 session inactive |
是否已启动会话、页面是否提前停止 | 重新调用 startNfcSession,不要在启动后立即 stop |
9060006 tag unavailable |
标签是否贴近、是否已触发发现回调 | 在标签回调后操作,或保持会话等待重新贴卡 |
9060007 tag expired / 9060008 tag lost |
标签 TTL 与感应距离 | 重新贴卡并在活动时间窗内完成操作 |
| iOS 能读 NDEF 但高级命令失败 | AID、System Code、技术对象和系统边界 | 查看 iOS 八项边界与项目签名配置 |
| 写入失败 | 标签是否可写、容量是否足够、是否已格式化 | 先读卡确认状态;只在测试标签上尝试格式化 |
排查时先记录 getNfcCapabilities、getNfcStatus、标签 techs 和完整 NfcFail,但不要把真实密钥、个人数据或生产 APDU 打进日志。
第 9 步:按需查询 32 个 API
| 分类 | API |
|---|---|
| 配置与状态 | configureNfc、getNfcCapabilities、getNfcStatus、openNfcSettings |
| 会话与标签 | startNfcSession、stopNfcSession、scanTagOnce、onTagDiscovered、offTagDiscovered、getLastTag、clearLastTag、cancelNfcOperation |
| NDEF | readNdef、getNdefStatus、writeNdef、formatAndWriteNdef、buildTextRecord、buildUriRecord、buildMimeRecord、buildExternalRecord、parseNdefMessage |
| 技术指令 | nfcATransceive、nfcBTransceive、nfcFTransceive、nfcVTransceive、isoDepTransceive |
| MifareClassic | mifareClassicAuthenticate、mifareClassicReadBlock、mifareClassicWriteBlock、mifareClassicReadSector |
| MifareUltralight | mifareUltralightReadPages、mifareUltralightWritePage |
API 详细说明(参考手册)
configureNfc(options)
说明 配置会话保持、标签 TTL、去重、等待队列和 Android ReaderMode 策略。
支持平台 Android / iOS / HarmonyOS;部分字段只在对应平台生效。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcConfigureOptions | 否 | 配置对象 | 空对象 | success / fail / complete 及下列字段 |
| options.useReaderMode | boolean | 否 | Android 是否优先使用 ReaderMode | true | true / false |
| options.keepSessionAlive | boolean | 否 | 发现标签后是否保持会话 | true | true / false |
| options.activeTagTtlMs | number | 否 | 活动标签可操作时间窗,毫秒 | 30000 | 正整数 |
| options.dedupeMs | number | 否 | 同一 UID 去重窗口,毫秒 | Android/HarmonyOS 800,iOS 500 | 正整数 |
| options.pendingMax | number | 否 | Android/HarmonyOS 等待操作上限 | 16 | 正整数 |
| options.skipNdefCheck | boolean | 否 | Android/HarmonyOS 是否跳过自动 NDEF 探测 | false | true / false |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;成功回调返回当前平台和生效配置。
错误码 Android / iOS / HarmonyOS 当前直接通过 success 返回生效配置;Web / 小程序降级入口返回 9060001。
示例
import { configureNfc } from '@/uni_modules/lizhao-nfc-pro'
// 更新后续会话使用的运行策略。
configureNfc({ keepSessionAlive: true, activeTagTtlMs: 30000 })
getNfcCapabilities(options)
说明 查询当前平台真实 NFC 技术能力矩阵。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcCapabilityOptions | 否 | 回调对象 | 空对象 | success / fail / complete |
返回值 void;success 返回 NfcCapability。
错误码 当前各平台均通过 success 返回能力对象,不进入 fail。
示例
import { getNfcCapabilities } from '@/uni_modules/lizhao-nfc-pro'
// 启用业务按钮前先读取真实平台能力。
getNfcCapabilities({ success: (res: any): void => console.log(res) })
getNfcStatus(options)
说明 查询 NFC 支持状态、系统开关、权限、会话和活动标签状态。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcStatusOptions | 否 | 回调对象 | 空对象 | success / fail / complete |
返回值 void;success 返回 NfcStatus。
错误码
当前各平台均通过 success 返回状态对象;不支持平台会在状态对象中明确 supported: false,不进入 fail。
示例
import { getNfcStatus } from '@/uni_modules/lizhao-nfc-pro'
// 检查开关与权限后再启动读卡会话。
getNfcStatus({ success: (status: any): void => console.log(status) })
openNfcSettings(options)
说明 打开 Android 系统 NFC 设置页。iOS 和 HarmonyOS 没有插件可直接打开的等价设置入口,会明确失败。
支持平台 Android;iOS / HarmonyOS 返回不支持。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcBaseOptions | 否 | 回调对象 | 空对象 | success / fail / complete |
返回值 void;Android 成功回调表示已发起系统页面跳转。
错误码 可能返回 9060001、9060002 或 9060015。iOS / HarmonyOS 因没有可直接打开的等价设置入口返回 9060001;Android 上下文不可用返回 9060002,系统页面跳转失败返回 9060015。
示例
import { openNfcSettings } from '@/uni_modules/lizhao-nfc-pro'
// 仅 Android 提供可直接打开的 NFC 设置页。
openNfcSettings({ fail: (err): void => console.error(err) })
startNfcSession(options)
说明 启动原生 NFC 标签发现会话。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcSessionOptions | 否 | 会话参数 | 空对象 | alertMessage / keepSessionAlive / success / fail / complete |
| options.alertMessage | string | 否 | 系统读卡提示或业务提示 | 平台中文默认提示 | 任意非空字符串 |
| options.keepSessionAlive | boolean | 否 | 发现标签后是否保持会话 | configureNfc 当前值 | true / false |
| options.success / fail / complete | function | 否 | 启动成功、启动失败、完成回调 | 无 | 无 |
返回值 void;success 只表示会话启动,不表示已经发现标签。
错误码 可能返回 9060001、9060002、9060003、9060004、9060015 或 9060016。
示例
import { startNfcSession } from '@/uni_modules/lizhao-nfc-pro'
// 先注册标签监听,再启动会话。
startNfcSession({ alertMessage: '请靠近 NFC 标签' })
stopNfcSession(options)
说明 停止当前会话并取消该会话尚未执行的等待操作。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcBaseOptions | 否 | 回调对象 | 空对象 | success / fail / complete |
返回值 void;success 返回停止结果。
错误码 可能返回 9060002;被取消的等待操作返回 9060005。
示例
import { stopNfcSession } from '@/uni_modules/lizhao-nfc-pro'
// 页面退出时主动释放原生会话。
stopNfcSession()
scanTagOnce(options)
说明 在当前没有业务会话时启动一次性标签扫描,首张标签成功、启动失败或超时后自动清理内部监听、计时器和会话。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcScanTagOnceOptions | 否 | 一次性扫描参数 | 空对象 | timeoutMs / alertMessage / success / fail / complete |
| options.timeoutMs | number | 否 | 等待标签超时毫秒数 | 15000 | 正整数 |
| options.alertMessage | string | 否 | 系统或业务读卡提示 | 平台默认中文提示 | 任意非空字符串 |
| options.success / fail / complete | function | 否 | 标签成功、失败、完成回调 | 无 | 无 |
返回值
void;success 返回 NfcTagInfo。
错误码 已有会话返回 9060015;等待超时返回 9060016;能力、权限或系统开关异常沿用会话错误码。
示例
import { scanTagOnce } from '@/uni_modules/lizhao-nfc-pro'
// 适合“点一下读一张卡”的页面。
scanTagOnce({ success: (tag: any): void => console.log(tag.uidHex) })
onTagDiscovered(listener)
说明 注册持续标签发现监听;同一函数可以在 offTagDiscovered 中精确退订。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| listener | NfcTagListener | 是 | 接收 NfcTagInfo 的持续监听函数 | 无 | 无 |
返回值 void;标签通过 listener 持续返回。
错误码 该方法不使用 fail 回调;平台会话错误由 startNfcSession 返回。
示例
import { onTagDiscovered } from '@/uni_modules/lizhao-nfc-pro'
// 保存监听引用,便于页面卸载时精确退订。
const listener = (tag): void => console.log(tag.uidHex)
onTagDiscovered(listener)
offTagDiscovered(listener)
说明 注销指定监听;不传 listener 或传 null 时清空全部标签监听。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| listener | NfcTagListener / null | 否 | 要注销的原监听函数 | null | 函数 / null |
返回值 void。
错误码 该方法不使用错误回调。
示例
import { offTagDiscovered } from '@/uni_modules/lizhao-nfc-pro'
// 不传参数会清空当前模块注册的全部标签监听。
offTagDiscovered()
getLastTag(options)
说明
读取 TTL 内缓存的最近活动标签。includeNdef 是为兼容既有调用保留的字段,当前 Android、iOS、HarmonyOS 实现均忽略该字段,返回内容只取决于当前标签缓存。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcGetLastTagOptions | 否 | 查询参数 | 空对象 | includeNdef / success / fail / complete |
| options.includeNdef | boolean | 否 | 兼容保留字段;当前三端均忽略,不会触发额外 NDEF 读取或解析 | false | true / false |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;存在有效缓存时 success 返回 NfcTagInfo。没有缓存标签时,Android / iOS 通过 success 返回空标签对象;HarmonyOS 通过 fail 返回 9060006,缓存过期返回 9060007。
错误码 HarmonyOS 可能返回 9060006 或 9060007;Android / iOS 无缓存时返回空标签对象,不进入 fail。
示例
import { getLastTag } from '@/uni_modules/lizhao-nfc-pro'
// 读取当前缓存标签;需要 NDEF 内容时请再调用 readNdef。
getLastTag({ success: (tag: any): void => console.log(tag) })
clearLastTag(options)
说明 清除缓存标签和原生技术对象,后续标签操作需重新贴卡。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcBaseOptions | 否 | 回调对象 | 空对象 | success / fail / complete |
返回值 void;success 返回清理结果。
错误码 当前各平台均直接清理缓存并通过 success 返回结果,不进入 fail。
示例
import { clearLastTag } from '@/uni_modules/lizhao-nfc-pro'
// 敏感操作完成后清除活动标签引用。
clearLastTag()
cancelNfcOperation(options)
说明
按 operationId 精确取消 Android / HarmonyOS 尚在等待标签的队列项;不会中断已经开始的原生 I/O。
支持平台
Android / HarmonyOS 支持等待队列取消;iOS 返回结构化 cancelled: false。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcCancelOperationOptions | 是 | 取消参数 | 无 | operationId / success / fail / complete |
| options.operationId | string | 是 | 标签操作提交时使用的精确标识 | 无 | 任意非空字符串 |
| options.success / fail / complete | function | 否 | 结果、失败、完成回调 | 无 | 无 |
返回值
void;success 返回 NfcCancelOperationResult,其中 cancelled 表示是否找到仍在等待的操作。
错误码
空 operationId 返回 9060013;被取消的原调用返回 9060005。
示例
import { cancelNfcOperation } from '@/uni_modules/lizhao-nfc-pro'
cancelNfcOperation({ operationId: 'asset-read-1001' })
readNdef(options)
说明 读取活动标签的 NDEF 记录并解析首个文本和 URI。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcReadOptions | 否 | 回调对象 | 空对象 | operationId / success / fail / complete |
| options.operationId | string | 否 | 等待队列精确取消标识 | 平台生成内部标识 | 任意非空字符串 |
返回值 void;success 返回 NfcOperationResult,records 为 NDEF 记录数组。
错误码 可能返回 9060005、9060006、9060007、9060008、9060010、9060014 或 9060015。
示例
import { readNdef } from '@/uni_modules/lizhao-nfc-pro'
// 在标签发现回调内读取,避免超过活动标签 TTL。
readNdef({ success: (res: any): void => console.log(res.records) })
getNdefStatus(options)
说明 查询活动标签的 NDEF 格式、可读写、容量、当前消息大小、标签类型、可格式化和可转只读能力;本接口不会执行不可逆的只读转换。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcGetNdefStatusOptions | 否 | 状态查询参数 | 空对象 | operationId / success / fail / complete |
| options.operationId | string | 否 | Android/HarmonyOS 等待项标识 | 平台生成内部标识 | 任意非空字符串 |
| options.success / fail / complete | function | 否 | 状态成功、失败、完成回调 | 无 | 无 |
返回值
void;success 返回 NfcNdefStatusResult。HarmonyOS capacity=-1,iOS messageSize=-1 表示平台未提供或本次不额外读取。
错误码 可能返回 9060005、9060006、9060007、9060010、9060014 或 9060015。
示例
import { getNdefStatus } from '@/uni_modules/lizhao-nfc-pro'
// 写入前先检查 writable,并仅在 capacity >= 0 时比较容量。
getNdefStatus({ success: (status: any): void => console.log(status.writable) })
writeNdef(options)
说明 把 NfcNdefRecord 数组写入已格式化且可写的 NDEF 标签。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcWriteOptions | 是 | 写入参数 | 无 | records / success / fail / complete |
| options.records | Array<NfcNdefRecord> | 是 | 要写入的 NDEF 记录,不能为空 | 无 | 文本、URI、MIME、外部类型、原始记录 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 返回 NfcOperationResult。
错误码 可能返回 9060002、9060005、9060006、9060007、9060008、9060010、9060011、9060013 或 9060015;iOS 在 records 为空时返回 9060002。
示例
import { buildTextRecord, writeNdef } from '@/uni_modules/lizhao-nfc-pro'
// 先构造标准文本记录,再写入活动标签。
writeNdef({ records: [buildTextRecord({ text: '巡检完成' })] })
formatAndWriteNdef(options)
说明 格式化 NdefFormatable 标签并写入记录。iOS Core NFC 不提供通用格式化能力。
支持平台 Android / HarmonyOS;iOS 返回不支持。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcWriteOptions | 是 | 格式化写入参数 | 无 | records / success / fail / complete |
| options.records | Array<NfcNdefRecord> | 是 | 格式化后写入的记录 | 无 | 无 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 返回 NfcOperationResult。
错误码 可能返回 9060001、9060005、9060006、9060007、9060008、9060010、9060012、9060013 或 9060015。iOS 因不提供通用 NDEF 格式化能力返回 9060001。
示例
import { buildUriRecord, formatAndWriteNdef } from '@/uni_modules/lizhao-nfc-pro'
// 仅 Android/HarmonyOS 对可格式化标签执行。
formatAndWriteNdef({ records: [buildUriRecord({ uri: 'https://example.com' })] })
buildTextRecord(options)
说明 同步构造标准 NDEF 文本记录。
支持平台 Android / iOS / HarmonyOS,以及不依赖原生会话的公共逻辑。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcBuildTextRecordOptions | 是 | 文本记录参数 | 无 | text / lang / encoding |
| options.text | string | 是 | 文本内容 | 无 | 无 |
| options.lang | string | 否 | 语言标记 | zh-CN | BCP 47 语言标记 |
| options.encoding | string | 否 | 文本编码 | utf-8 | utf-8 / utf-16 |
返回值 NfcNdefRecord。
错误码 同步构造不使用 fail 回调;非法业务内容应在调用前校验。
示例
import { buildTextRecord } from '@/uni_modules/lizhao-nfc-pro'
// 构造可直接交给 writeNdef 的文本记录。
const record = buildTextRecord({ text: '资产编号 A-1001', lang: 'zh-CN' })
buildUriRecord(options)
说明 同步构造标准 NDEF URI 记录。
支持平台 Android / iOS / HarmonyOS,以及不依赖原生会话的公共逻辑。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcBuildUriRecordOptions | 是 | URI 记录参数 | 无 | uri |
| options.uri | string | 是 | 完整 URI | 无 | http / https / 自定义 scheme |
返回值 NfcNdefRecord。
错误码 同步构造不使用 fail 回调;调用前应校验 URI。
示例
import { buildUriRecord } from '@/uni_modules/lizhao-nfc-pro'
// 构造一个 HTTPS 链接记录。
const record = buildUriRecord({ uri: 'https://example.com/device/A-1001' })
buildMimeRecord(options)
说明 同步构造 MIME NDEF 记录,适合 JSON、图片描述或业务自定义二进制载荷。
支持平台 全部平台;纯函数不访问 NFC 硬件。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcBuildMimeRecordOptions | 是 | MIME 记录参数 | 无 | mimeType / payloadHex / id |
| options.mimeType | string | 是 | 标准 MIME 类型 | 无 | 例如 application/json |
| options.payloadHex | string | 是 | 载荷十六进制 | 无 | 偶数长度十六进制 |
| options.id | string | 否 | 记录 ID 十六进制 | 空字符串 | 偶数长度十六进制 |
返回值
NfcNdefRecord。
错误码 同步构造不使用 fail 回调;调用前应校验 MIME 类型和十六进制载荷。
示例
import { buildMimeRecord } from '@/uni_modules/lizhao-nfc-pro'
const record = buildMimeRecord({ mimeType: 'application/json', payloadHex: '7B226F6B223A747275657D' })
buildExternalRecord(options)
说明
同步构造 NFC Forum External Type 记录,最终类型为 domain:type。
支持平台 全部平台;纯函数不访问 NFC 硬件。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcBuildExternalRecordOptions | 是 | External 记录参数 | 无 | domain / type / payloadHex / id |
| options.domain | string | 是 | 自有域名 | 无 | 例如 example.com |
| options.type | string | 是 | 域内类型 | 无 | 例如 device |
| options.payloadHex | string | 是 | 载荷十六进制 | 无 | 偶数长度十六进制 |
| options.id | string | 否 | 记录 ID 十六进制 | 空字符串 | 偶数长度十六进制 |
返回值
NfcNdefRecord。
错误码 同步构造不使用 fail 回调;调用前应校验域名、类型和十六进制载荷。
示例
import { buildExternalRecord } from '@/uni_modules/lizhao-nfc-pro'
const record = buildExternalRecord({ domain: 'example.com', type: 'device', payloadHex: '6C697A68616F' })
parseNdefMessage(options)
说明
同步解析 NDEF 记录并返回首个文本和 URI。Android、iOS、HarmonyOS 都会优先使用平台 NDEF 消息解析能力处理 rawMessageHex;非法输入回退为公共结构化结果,不抛出未捕获异常。
支持平台 Android / iOS / HarmonyOS,以及不依赖原生会话的公共逻辑。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcParseNdefOptions | 是 | 解析参数 | 无 | records / rawMessageHex |
| options.records | Array<NfcNdefRecord> | 否 | 已知记录数组 | 空数组 | 无 |
| options.rawMessageHex | string | 否 | 原始 NDEF 消息十六进制;三端均尝试系统解析 | 空字符串 | 偶数长度十六进制 |
返回值 NfcParseNdefResult。
错误码 同步解析不使用 fail 回调;无法识别的数据保留为 raw 结果。
示例
import { parseNdefMessage } from '@/uni_modules/lizhao-nfc-pro'
// 使用合法的 NDEF 文本消息验证原始十六进制解析。
const parsed = parseNdefMessage({ rawMessageHex: 'D101085402656E48656C6C6F' })
console.log(parsed.firstText)
nfcATransceive(options)
说明 向活动 NfcA 标签发送原始十六进制指令。
支持平台 Android / HarmonyOS;iOS 不开放通用 NfcA raw transceive。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcTransceiveOptions | 是 | 指令参数 | 无 | hex / timeoutMs / success / fail / complete |
| options.hex | string | 是 | 指令十六进制 | 无 | 偶数长度十六进制 |
| options.timeoutMs | number | 否 | 指令超时,毫秒 | 平台默认值 | 正整数 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 的 bytesHex 为响应字节。
错误码 可能返回 9060005、9060006、9060007、9060008、9060010、9060013、9060014 或 9060015。
示例
import { nfcATransceive } from '@/uni_modules/lizhao-nfc-pro'
// 示例指令仅用于展示格式,真实命令必须遵循目标标签协议。
nfcATransceive({ hex: '3004', timeoutMs: 1000 })
nfcBTransceive(options)
说明 向活动 NfcB 标签发送原始十六进制指令。
支持平台 Android / HarmonyOS;iOS 不开放通用 NfcB raw transceive。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcTransceiveOptions | 是 | 指令参数 | 无 | hex / timeoutMs / success / fail / complete |
| options.hex | string | 是 | 指令十六进制 | 无 | 偶数长度十六进制 |
| options.timeoutMs | number | 否 | 指令超时,毫秒 | 平台默认值 | 正整数 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 的 bytesHex 为响应字节。
错误码 可能返回 9060005、9060006、9060007、9060008、9060010、9060013、9060014 或 9060015。
示例
import { nfcBTransceive } from '@/uni_modules/lizhao-nfc-pro'
// 发送前按卡片厂商协议生成完整命令。
nfcBTransceive({ hex: '0500', fail: (err): void => console.error(err) })
nfcFTransceive(options)
说明 向活动 NfcF / FeliCa 标签发送原始十六进制指令。
支持平台 Android / iOS / HarmonyOS;iOS 需配置业务 System Code。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcTransceiveOptions | 是 | 指令参数 | 无 | hex / timeoutMs / success / fail / complete |
| options.hex | string | 是 | NfcF 指令十六进制 | 无 | 偶数长度十六进制 |
| options.timeoutMs | number | 否 | 指令超时,毫秒 | 平台默认值 | 正整数 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 的 bytesHex 为响应字节。
错误码 可能返回 9060005、9060006、9060007、9060008、9060010、9060013、9060014 或 9060015。
示例
import { nfcFTransceive } from '@/uni_modules/lizhao-nfc-pro'
// 命令内容必须与业务 FeliCa System Code 和服务定义匹配。
nfcFTransceive({ hex: '0600', fail: (err): void => console.error(err) })
nfcVTransceive(options)
说明 向活动 NfcV / ISO 15693 标签发送指令;首字节为 requestFlags,第二字节为 commandCode。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcTransceiveOptions | 是 | 指令参数 | 无 | hex / timeoutMs / success / fail / complete |
| options.hex | string | 是 | 至少两个字节的 NfcV 指令 | 无 | 偶数长度十六进制 |
| options.timeoutMs | number | 否 | 指令超时,毫秒 | 平台默认值 | 正整数 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 的 bytesHex 为响应字节。
错误码 可能返回 9060005、9060006、9060007、9060008、9060010、9060013、9060014 或 9060015。
示例
import { nfcVTransceive } from '@/uni_modules/lizhao-nfc-pro'
// 02 为示例 requestFlags,20 为示例 commandCode。
nfcVTransceive({ hex: '0220', fail: (err): void => console.error(err) })
isoDepTransceive(options)
说明 通过 IsoDep 发送 APDU;iOS 对应 ISO7816 标签能力。
支持平台 Android / iOS / HarmonyOS;iOS 需把业务 AID 配入签名和 Info.plist。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcIsoDepTransceiveOptions | 是 | APDU 参数 | 无 | hex / timeoutMs / success / fail / complete |
| options.hex | string | 是 | APDU 十六进制 | 无 | 偶数长度十六进制 |
| options.timeoutMs | number | 否 | 指令超时,毫秒 | 平台默认值 | 正整数 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 的 bytesHex 包含响应数据和状态字。
错误码 可能返回 9060005、9060006、9060007、9060008、9060010、9060013、9060014 或 9060015。
示例
import { isoDepTransceive } from '@/uni_modules/lizhao-nfc-pro'
// SELECT AID 仅为结构示例,请替换为已配置并获授权的业务 AID。
isoDepTransceive({ hex: '00A4040007D2760000850101' })
mifareClassicAuthenticate(options)
说明 使用 Key A 或 Key B 对 MifareClassic 扇区鉴权。
支持平台 Android / HarmonyOS;iOS Core NFC 不支持 MifareClassic。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcMifareClassicAuthOptions | 是 | 鉴权参数 | 无 | sectorIndex / keyType / keyHex / 回调 |
| options.sectorIndex | number | 是 | 扇区索引 | 无 | 非负整数 |
| options.keyType | string | 是 | 密钥类型 | 无 | A / B |
| options.keyHex | string | 是 | 6 字节密钥十六进制 | 无 | 12 个十六进制字符 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 表示当前标签扇区鉴权成功。
错误码 可能返回 9060001、9060005、9060006、9060007、9060008、9060009、9060010、9060013 或 9060015。iOS 因不支持 MifareClassic 返回 9060001。
示例
import { mifareClassicAuthenticate } from '@/uni_modules/lizhao-nfc-pro'
// 密钥仅为常见示例,生产环境不得在页面明文硬编码真实密钥。
mifareClassicAuthenticate({ sectorIndex: 1, keyType: 'A', keyHex: 'FFFFFFFFFFFF' })
mifareClassicReadBlock(options)
说明 读取 MifareClassic 单个块;业务应先完成对应扇区鉴权。
支持平台 Android / HarmonyOS;iOS Core NFC 不支持 MifareClassic。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcMifareClassicBlockOptions | 是 | 读块参数 | 无 | blockIndex / success / fail / complete |
| options.blockIndex | number | 是 | 块索引 | 无 | 非负整数 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 的 bytesHex 为块数据。
错误码 可能返回 9060001、9060005、9060006、9060007、9060008、9060009、9060010、9060014 或 9060015。iOS 因不支持 MifareClassic 返回 9060001。
示例
import { mifareClassicReadBlock } from '@/uni_modules/lizhao-nfc-pro'
// 先鉴权对应扇区,再读取业务块。
mifareClassicReadBlock({ blockIndex: 4, success: (res: any): void => console.log(res.bytesHex) })
mifareClassicWriteBlock(options)
说明 向 MifareClassic 单个块写入恰好 16 字节数据;业务应先鉴权。
支持平台 Android / HarmonyOS;iOS Core NFC 不支持 MifareClassic。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcMifareClassicWriteBlockOptions | 是 | 写块参数 | 无 | blockIndex / dataHex / 回调 |
| options.blockIndex | number | 是 | 块索引 | 无 | 非负整数 |
| options.dataHex | string | 是 | 16 字节块数据 | 无 | 32 个十六进制字符 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 表示块写入完成。
错误码 可能返回 9060001、9060005、9060006、9060007、9060008、9060009、9060010、9060011、9060013 或 9060015。iOS 因不支持 MifareClassic 返回 9060001。
示例
import { mifareClassicWriteBlock } from '@/uni_modules/lizhao-nfc-pro'
// 禁止写入厂商块或扇区尾块,示例只展示 16 字节格式。
mifareClassicWriteBlock({ blockIndex: 4, dataHex: '00000000000000000000000000000000' })
mifareClassicReadSector(options)
说明 读取 MifareClassic 指定扇区的全部块;业务应先完成该扇区鉴权。
支持平台 Android / HarmonyOS;iOS Core NFC 不支持 MifareClassic。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcMifareClassicSectorOptions | 是 | 读扇区参数 | 无 | sectorIndex / success / fail / complete |
| options.sectorIndex | number | 是 | 扇区索引 | 无 | 非负整数 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 的 bytesHex 为按块拼接的数据。
错误码 可能返回 9060001、9060005、9060006、9060007、9060008、9060009、9060010、9060014 或 9060015。iOS 因不支持 MifareClassic 返回 9060001。
示例
import { mifareClassicReadSector } from '@/uni_modules/lizhao-nfc-pro'
// 先完成目标扇区鉴权,再读取该扇区。
mifareClassicReadSector({ sectorIndex: 1 })
mifareUltralightReadPages(options)
说明 从 MifareUltralight 指定页开始连续读取四页。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcMifareUltralightReadOptions | 是 | 读页参数 | 无 | pageIndex / success / fail / complete |
| options.pageIndex | number | 是 | 起始页索引 | 无 | 0 到 255 的整数 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 的 bytesHex 为连续四页数据。
错误码 可能返回 9060005、9060006、9060007、9060008、9060010、9060013、9060014 或 9060015。
示例
import { mifareUltralightReadPages } from '@/uni_modules/lizhao-nfc-pro'
// 从第 4 页开始连续读取四页。
mifareUltralightReadPages({ pageIndex: 4 })
mifareUltralightWritePage(options)
说明 向 MifareUltralight 指定页写入恰好 4 字节。
支持平台 Android / iOS / HarmonyOS。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | NfcMifareUltralightWriteOptions | 是 | 写页参数 | 无 | pageIndex / dataHex / 回调 |
| options.pageIndex | number | 是 | 页索引 | 无 | 0 到 255 的整数 |
| options.dataHex | string | 是 | 4 字节数据 | 无 | 8 个十六进制字符 |
| options.success / fail / complete | function | 否 | 成功、失败、完成回调 | 无 | 无 |
返回值 void;success 表示单页写入完成。
错误码 可能返回 9060005、9060006、9060007、9060008、9060010、9060011、9060013 或 9060015。
示例
import { mifareUltralightWritePage } from '@/uni_modules/lizhao-nfc-pro'
// 写入前确认目标页可写且不是锁定位、配置页或厂商保留页。
mifareUltralightWritePage({ pageIndex: 4, dataHex: '01020304' })
技术能力矩阵
本矩阵描述 App 原生能力;Web 与小程序不提供这些原生技术对象。
| 技术能力 | Android | iOS | HarmonyOS |
|---|---|---|---|
| NFC 状态查询 | 支持 | 支持;系统不提供独立开关跳转 | 支持;系统不提供插件直达设置入口 |
| 标签发现与活动标签 TTL | 支持 | 支持 | 支持 |
| NDEF 读取 | 支持 | 支持 | 支持 |
| NDEF 写入 | 支持 | 支持已格式化且可写标签 | 支持 |
| NDEF 格式化 | 支持 | 不支持 | 支持 |
| NfcA | 支持原始指令 | 可识别;不开放通用 raw transceive | 支持原始指令 |
| NfcB | 支持原始指令 | 可识别;不开放通用 raw transceive | 支持原始指令 |
| NfcF / FeliCa | 支持原始指令 | 支持,需业务 System Code | 支持原始指令 |
| NfcV / ISO 15693 | 支持原始指令 | 支持 | 支持原始指令 |
| IsoDep / ISO 7816 | 支持 APDU | 支持,需业务 AID | 支持 APDU |
| MifareClassic | 支持鉴权、读块、写块、读扇区 | 不支持 | 支持鉴权、读块、写块、读扇区 |
| MifareUltralight | 支持读页、写页 | 支持读页、写页 | 支持读页、写页 |
| 通用 rawTransceive 标志 | 支持 | 不支持;仅开放上表列出的专用技术命令 | 支持 |
iOS 八项系统与技术边界
以下八个公开 API 在 iOS 会明确失败,不会伪造成功:
- openNfcSettings:iOS 没有应用可直接打开的 NFC 开关设置页。
- formatAndWriteNdef:Core NFC 不提供通用 NDEF 格式化。
- nfcATransceive:Core NFC 不开放通用 NfcA raw transceive。
- nfcBTransceive:Core NFC 不开放通用 NfcB raw transceive。
- mifareClassicAuthenticate:不支持 MifareClassic 扇区密钥鉴权。
- mifareClassicReadBlock:不支持 MifareClassic 块读取。
- mifareClassicWriteBlock:不支持 MifareClassic 块写入。
- mifareClassicReadSector:不支持 MifareClassic 扇区读取。
iOS 的 NfcF、NfcV、IsoDep/ISO7816、MifareUltralight 是专用原生路径,不能因 rawTransceive 为 false 而误判为全部不可用。
权限、Capability、AID、System Code 与自定义基座
Android
- AndroidManifest.xml 需要 android.permission.NFC 和 android.hardware.nfc。
- NFC 不是运行时危险权限,但设备必须具备 NFC 芯片且系统开关已开启。
- 插件包含 Android 原生 UTS 逻辑,修改后必须重新原生联编或重新打 Android 自定义基座。
iOS
- Info.plist 必须包含 NFCReaderUsageDescription。
- Apple Developer App ID、证书与描述文件必须启用 NFC Tag Reading capability。
- 签名产物需要 com.apple.developer.nfc.readersession.formats;仓库中的 UTS.entitlements 默认不写死该键,最终值必须由实际 App 能力、证书和描述文件一致生成。
- ISO7816 业务需要把真实 AID 配置到 com.apple.developer.nfc.readersession.iso7816.select-identifiers。示例 D2760000850101 不能替代你的业务 AID。
- FeliCa/NfcF 业务需要把真实 System Code 配置到 com.apple.developer.nfc.readersession.felica.systemcodes。FFFF 只用于通用轮询,发布前应按业务签名配置核对。
- 仅修改 UTS.entitlements 文本不能补齐 Apple Developer 后台能力或描述文件;签名不一致会导致会话不可用。
- 插件包含 Swift 与 iOS UTS 原生逻辑,修改后必须重新原生联编或重新打 iOS 自定义基座。
HarmonyOS
- module.json5 需要 ohos.permission.NFC_TAG。
- 设备必须公开对应 NFC Kit 能力;权限或能力缺失会返回明确错误。
- 插件包含 HarmonyOS 原生 UTS 逻辑,修改后必须重新原生联编或重新打 HarmonyOS 自定义基座。
为什么 appResource / wgt 不够
Android、iOS、HarmonyOS 的 NFC 能力都包含编译进安装包的原生实现、权限或 Capability。appResource / wgt 只能更新页面与普通资源,不能替换旧基座里的 UTS 原生代码、Swift、系统权限、entitlements、AID 或 System Code 配置。本次原生能力更新后,三个 App 平台都需要重新联编或重新制作对应自定义基座。
统一错误码
NfcFail.details 会携带 platform、apiName、nativeCode、nativeMessage、tech 和 reason 等诊断字段。业务应以 errCode 做稳定分支,以 details 辅助日志定位。
| 错误码 | 含义 | 说明 |
|---|---|---|
| 9060001 | platform unsupported | 当前平台或设备不支持 NFC |
| 9060002 | native context unavailable | 原生上下文不可用 |
| 9060003 | permission denied | NFC 权限、Capability 或签名权限不足 |
| 9060004 | nfc disabled | 系统 NFC 开关未开启 |
| 9060005 | session inactive | 会话未启动、已关闭或等待操作被取消 |
| 9060006 | tag unavailable | 当前没有可操作标签 |
| 9060007 | tag expired | 活动标签已超过 TTL |
| 9060008 | tech unsupported | 当前标签不支持目标技术 |
| 9060009 | authentication failed | MifareClassic 鉴权失败 |
| 9060010 | tag lost | 操作期间标签离开感应区 |
| 9060011 | write failed | 标签写入失败 |
| 9060012 | format failed | NDEF 格式化并写入失败 |
| 9060013 | invalid payload | 参数、十六进制或 NDEF 载荷不合法 |
| 9060014 | transceive failed | 原始指令交互失败 |
| 9060015 | reader busy | 读卡器忙、会话冲突或等待队列已满 |
| 9060016 | session timeout | 会话或活动标签等待超时 |
| 9060017 | native capability unavailable | 当前平台未提供该原生能力 |
返回结构
NfcTagInfo
| 字段 | 类型 | 说明 |
|---|---|---|
| uidHex | string | 标签 UID 十六进制 |
| idBase64 | string | 标签 id 的 Base64 表达 |
| techs | Array<NfcTech> | 原生识别到的技术类型 |
| ndef | boolean | 是否检测到 NDEF |
| ndefText / ndefUri | string | 首个文本与 URI |
| platform | NfcPlatform | 当前平台 |
| timestamp | number | 发现时间戳 |
| action | string | 触发来源 |
| sessionId | string | 所属会话 id |
| extras | any / null | 平台扩展信息 |
NfcOperationResult
| 字段 | 类型 | 说明 |
|---|---|---|
| success | boolean | 操作是否成功 |
| platform | NfcPlatform | 当前平台 |
| action | string | API 动作名称 |
| tag | NfcTagInfo / null | 当前标签 |
| bytesHex | string | 指令或块数据响应 |
| records | Array<NfcNdefRecord> | NDEF 记录 |
| message | string | 中文结果说明 |
实体标签与安全注意
- 发布前必须用目标 Android、iPhone 和 HarmonyOS 真机以及目标标签类型验证;模拟器和静态编译不能证明射频链路可用。
- 标签必须保持在感应区内,TagLost 后应重新贴卡,不要对旧标签对象无限重试。
- UID 不是安全身份凭证,不能单独用于门禁授权、支付或防伪判断。
- MifareClassic 密钥、APDU 密钥材料和生产 AID 不要明文写入页面、README、日志或仓库,应使用受控后端、设备安全区或业务密钥体系。
- 写入前确认标签容量、只读位、锁定位、厂商块、扇区尾块和访问控制;错误写入可能永久锁卡。
- 日志应避免输出完整卡片个人数据、密钥、令牌和生产配置。
- keepSessionAlive 为 false 适合一次性扫描;连续读写应设为 true,并在完成后主动 stopNfcSession 和 clearLastTag。
- Web 与小程序不伪装 App 原生 NFC 能力;业务应根据 getNfcCapabilities 结果提供明确降级提示。
作者系列UTS插件
以下为已在 DCloud 插件市场上架的作者系列 UTS 插件,可按业务场景组合使用。未列出的插件表示当前未确认公开市场页,后续上架后再补充。
| 插件 | 能力方向 | 插件市场 |
|---|---|---|
lizhao-nfc-pro |
NFC 标签读写、NDEF、IsoDep 与诊断 | 查看插件 |
lizhao-float-window |
悬浮窗、画中画、权限与诊断 | 查看插件 |
lizhao-device-id |
设备标识、隐私策略与诊断 | 查看插件 |
lizhao-scan-pro |
原生扫码、连续扫码、相册识别 | 查看插件 |
lizhao-choose-file |
原生文件选择、上传、进度与取消 | 查看插件 |
lizhao-bg-audio |
背景音频播放、队列、倍速与事件 | 查看插件 |
lizhao-smart-tts |
系统 TTS、云端合成、听书方案 | 查看插件 |
lizhao-share-plus |
系统分享、远程文件下载后分享 | 查看插件 |
lizhao-sqlite-pro |
原生 SQLite、迁移、备份与诊断 | 查看插件 |
lizhao-icon-pro |
SVG 图标组件、多主题与缓存 | 查看插件 |
lizhao-cast-screen |
DLNA 投屏、AirPlay 路由入口 | 查看插件 |
lizhao-call-kit |
电话、短信、通讯录原生能力 | 查看插件 |
lizhao-app-keepalive |
应用保活、唤醒、自愈与报告 | 查看插件 |
lizhao-doc-corrector |
文档扫描、矫正、增强与识别 | 查看插件 |
lizhao-emu-detect |
模拟器环境检测、风险评分与证据 | 查看插件 |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 6485
赞赏 5
下载 12487869
赞赏 1938
赞赏
京公网安备:11010802035340号