更新记录

1.3.4(2026-11-03)

  • 新增按“读卡、NDEF、指令、标签、管理”组织的双宿主示例页签,常用功能直接展示,操作结果支持随页查看与完整、分段复制。
  • 优化 NDEF 读取、写入、构造解析和标签操作的界面分组,切换页签保留输入与原有调用,保留写卡风险说明、密码遮蔽及日志脱敏。
  • 统一发布版本、示例版本和诊断构建标记;公开 API 及原生 NFC 读写流程保持不变。

1.3.3(2026-10-30)

  • 修复 Android 已发现 NDEF 内容、主动读取暂时返回空值时直接提示没有内容的问题,增加同一标签内最多两次读取复核;无法确认时返回读取失败,保留真实空 NDEF 的成功结果。
  • 修复读取复核期间停止会话、标签失效或重新发现标签时可能继续使用旧请求的问题;保留原有失败码和一次回调结算。
  • 优化 Android NDEF 读取诊断,记录连接、读取、关闭阶段及尝试次数和耗时,便于区分通信失败与空内容。
  • 本版更新 Android 原生实现,需重新原生联编或安装匹配的新 Android 自定义基座;公开 API 调用方式不变。

1.3.2(2026-10-27)

  • 修复示例页面和辅助模块使用相对引入路径的问题,统一通过 @/uni_modules/ 引用插件内文件,复制页面到其他目录时无需另行复制辅助代码。
查看更多

平台兼容性

uni-app(4.84)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
√ √ × × √ √ √ √ √
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(4.84)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × √ √ √ ×

NFC 标签读写

介绍

为 uni-app、uni-app x 提供 Android、iOS、HarmonyOS NFC 识别、NDEF 读写和卡片协议交互。

插件市场:下载与查看支持平台

功能特色

特色功能 能解决什么问题 相关 API / 配置
单次识别标签 点击一次按钮,等待一张标签并取得 UID scanTagOnce
一次读取内容 自动管理读卡会话,拿到真实的 NDEF 文本、链接或记录 readNdefOnce
写入并回读 写入后读取同一张标签,确认内容是否一致 writeNdefOnce、verifyAfterWrite
连续采集标签 Android / iOS / HarmonyOS 在前台会话内依次识别多张标签 continuousScan、onTagDiscovered
写入前检查 判断标签是否已格式化、可写,查询可取得的容量信息 getNdefStatus
多种内容格式 构造文本、链接、MIME 和自定义 External 记录 buildTextRecord、buildUriRecord、buildMimeRecord、buildExternalRecord
自己编写业务页面 页面自由安排按钮、提示和结果区,插件负责 NFC 操作 startNfcSession、标签与状态监听
先操作、后贴卡 Android / HarmonyOS 可以让操作等待标签,并取消尚未执行的操作 operationId、cancelNfcOperation
专业卡片交互 按标签支持的协议发送 APDU、读取块或页 isoDepTransceive、nfc*Transceive、Mifare API
状态与错误查询 判断设备能力、系统开关和会话状态,获得明确失败原因 getNfcCapabilities、getNfcStatus、getNfcDiagnostics

适合哪些场景

场景 推荐能力 使用结果
设备绑定、标签登记 scanTagOnce 取得标签 UID,再由自己的业务关联设备或资料
资产巡检、点位签到 readNdefOnce 读取标签中存放的资产编号或点位内容
文本、链接电子标签 NDEF 构造器、writeNdefOnce 将说明文字或访问链接写入可写标签
批量登记、连续盘点 continuousScan、onTagDiscovered 读取一张后移开,再贴下一张
写入结果需要确认 writeNdefOnce 区分内容一致、内容不同和回读未完成
自有卡片协议 isoDepTransceive、技术指令 API 按已知协议取得卡片响应
Mifare 标签业务 MifareClassic / MifareUltralight API 在设备与标签支持的范围内操作扇区、块或页

普通文本、链接和资产编号业务可先使用 NDEF;高级协议需要卡片厂商协议。本插件不提供支付、交通卡充值、门禁卡破解或密钥提取。

下载与导入

  1. 在插件市场选择“使用 HBuilderX 导入插件”,导入自己的 uni-app 或 uni-app x 项目。
  2. 保留完整的 uni_modules/lizhao-nfc-pro 目录和插件名称。
  3. 页面脚本从插件根目录导入需要的方法:

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { scanTagOnce } from '@/uni_modules/lizhao-nfc-pro'

uni-app 使用普通页面脚本;uni-app x 使用 <script setup lang="uts">。不要直接导入 uni_modules/lizhao-nfc-pro/utssdk 或平台内部文件,也不要通过 uni.requireNativePlugin 调用。

完整示例位于项目的 uni_modules/lizhao-nfc-pro/example/ 目录下,按项目类型选择对应文件。以下路径均从项目根目录开始,可直接在 HBuilderX 项目目录中查找:

  • uni-app:uni_modules/lizhao-nfc-pro/example/uniapp/nfc.vue。
  • uni-app x:uni_modules/lizhao-nfc-pro/example/uniappx/index.uvue。

下面的示例需要在具备 NFC 能力的 App 真机上运行。首次接入的原生配置条件见后文“支持平台”。

复制完整示例到页面目录后,在 pages.json 注册对应页面。业务模块中的 UTS 类型写法用于 uni-app x;普通 uni-app 可直接参照同目录 JS 示例。

基础示例:识别一张标签

在页面按钮事件中调用。UID 是标签标识,NDEF 是标签存放文本、链接等内容的格式;取得 UID 不表示标签已有 NDEF 或允许写入。

uni-app 普通页面脚本:

import { scanTagOnce } from '@/uni_modules/lizhao-nfc-pro'

scanTagOnce({
  timeoutMs: 15000,
  success: (tag) => { console.log('标签 UID:', tag.uidHex) },
  fail: (err) => { console.error('识别失败:', err.errCode, err.errMsg) }
})

uni-app x 在 <script setup lang="uts"> 中使用强类型参数:

import { scanTagOnce, NfcScanTagOnceOptions } from '@/uni_modules/lizhao-nfc-pro'

const options: NfcScanTagOnceOptions = {
  timeoutMs: 15000,
  success: (tag) => { console.log('标签 UID:', tag.uidHex) },
  fail: (err) => { console.error('识别失败:', err.errCode, err.errMsg) }
}
scanTagOnce(options)

完整 uni-app x 页面见 uni_modules/lizhao-nfc-pro/example/uniappx/index.uvue。一次性 API 在成功、失败或超时后清理自己创建的会话;已有会话处于 starting / active / stopping 时返回 9060015,请等待当前操作结束。

按业务使用

以下片段从插件根目录调用真实 API。一次性 API 可放在按钮事件中;标注“会话内使用”的 API,需要先启动会话并发现标签。除专门展示生命周期的片段外,页面卸载时沿用基础示例的 stopNfcSession 清理。

模块一:读取标签里的文本或链接

适合资产编号、点位说明、设备链接等标准 NDEF 标签。不需要先调用 startNfcSession,点击后等待贴卡即可。

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { readNdefOnce, parseNdefMessage } from '@/uni_modules/lizhao-nfc-pro'

readNdefOnce({
  timeoutMs: 15000,
  alertMessage: '请靠近需要读取的标签',
  success: (res) => {
    // 从本次真实读取的记录中提取首个文本和链接。
    const content = parseNdefMessage({ records: res.records })
    console.log('标签 UID:', res.tag.uidHex)
    console.log('文本内容:', content.firstText)
    console.log('链接内容:', content.firstUri)
  },
  fail: (err) => {
    console.error('读取标签内容失败:', err.errCode, err.errMsg)
  }
})

firstText / firstUri 只取首个对应记录;业务需要全部记录时读取 res.records。只有 UID、没有 NDEF 的卡片,应使用 scanTagOnce 识别,或按卡片的技术协议处理。

模块二:写入文本或链接,并确认内容

适合给可写的 NDEF 标签设置资产编号、说明文字或访问链接。使用测试标签,点击写入后保持标签贴近,直到收到回调。

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { buildTextRecord, writeNdefOnce } from '@/uni_modules/lizhao-nfc-pro'

writeNdefOnce({
  records: [buildTextRecord({ text: '资产编号 A-1001', lang: 'zh-CN' })],
  verifyAfterWrite: true,
  timeoutMs: 15000,
  success: (res) => {
    // 写入已完成,只有 matched 才表示回读内容也一致。
    if (res.verificationStatus == 'matched') {
      console.log('写入成功,回读内容一致')
    } else {
      console.log('写入已完成,回读状态:', res.verificationStatus)
      console.log('回读说明:', res.mismatchReason, res.verificationErrorMessage)
    }
  },
  fail: (err) => {
    console.error('写入未确认完成:', err.errCode, err.errMsg)
  }
})

写入链接时,将上面的记录换成 buildUriRecord({ uri: 'https://example.com/device/A-1001' }),并从插件根目录导入 buildUriRecord。records 可以包含多条记录,但不能是空数组。

回读状态 verificationStatus 含义 如何处理
matched 写入完成,回读内容一致 可以确认业务完成
mismatched 写入完成,回读内容不同 提示人工检查,不自动重复写入
incomplete 写入完成,但回读失败或标签移开 不能确认内容一致,保留结果待检查
notRequested 写入完成,调用方关闭了回读 只确认写入操作完成

verifyAfterWrite 默认开启。进入 success 不一定表示回读一致,应检查 verificationStatus。该方法不会自动格式化、锁定标签或重新写入;失败信息中的 details.reason 可帮助判断写入未开始还是结果不确定。

模块三:连续读取多张标签

适合 Android / iOS / HarmonyOS 批量登记、盘点或连续采集。每次只放一张标签,读取后移开,再贴下一张。

下面采用 UTS 写法,uni-app 普通脚本去掉类型标注即可。监听器在页面进入时注册一次;“开始”按钮只调用 startContinuousScan,“停止”按钮调用 stopContinuousScan。

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import {
  onTagDiscovered, offTagDiscovered,
  startNfcSession, stopNfcSession, NfcTagInfo
} from '@/uni_modules/lizhao-nfc-pro'

// 每张标签的结果从这个监听器返回。
const handleTag = (tag: NfcTagInfo): void => {
  console.log('标签 UID:', tag.uidHex)
  console.log('可取得的文本和链接:', tag.ndefText, tag.ndefUri)
}
onTagDiscovered(handleTag)

function startContinuousScan(): void {
  startNfcSession({
    continuousScan: true,
    alertMessage: '读取后移开标签,再贴下一张',
    fail: (err) => {
      console.error('连续扫描启动失败:', err.errCode, err.errMsg)
    }
  })
}

function stopContinuousScan(): void {
  // 停止本次会话,保留页面监听以便再次开始。
  stopNfcSession({})
}

function disposeContinuousScan(): void {
  // 页面退出时,用注册时的同一函数引用退订。
  offTagDiscovered(handleTag)
  stopNfcSession({})
}

uni-app x 在 onUnload 中调用 disposeContinuousScan();uni-app 在页面 onUnload 中做相同清理。监听只需注册一次。Android 新订阅会向该监听回放仍有效的缓存标签;同一函数重复注册不再回放,其他监听不会因此重复收到结果。iOS 标签订阅等待后续发现事件,不回放历史标签。

  • 每张标签通过 onTagDiscovered 返回;startNfcSession.success/complete 只返回启动结果。
  • continuousScan 默认关闭;显式设为 true 时优先保持会话,即使同时传入 keepSessionAlive: false。iosContinuousScan 保留为兼容别名,新代码使用统一参数。
  • App 三端都需要保持前台。iOS 使用系统读卡弹窗,受取消和会话时限约束;结束后需要再次启动,不支持后台无限扫描。
  • Android 同一标签短时间内会去重;使用前台分发方式时,同一来源和 UID 至少去重 2 秒。是否再次报告未移开的同一张卡,还取决于设备回调,业务仍应按自己的规则去重。
  • ndefText / ndefUri 可能为空;需要完整 NDEF 内容时,在当前标签仍贴近的回调中调用 readNdef。完成本张卡读写后再换卡。
  • Android 的 readNdef / readNdefOnce 遇到暂时空返回或可恢复的读取通信错误时,在同一次标签发现内最多读取两次。发现时已有内容但复核仍为空,或通信错误后未取得消息,会返回 9060014;请提示“读取未完成,请保持贴近后重试”,不要显示为空卡。成功时以 res.records 为本次读取结果,res.tag 保留发现时快照。
  • scanTagOnce、readNdefOnce、writeNdefOnce 始终用于一次操作,不会变成连续扫描。continuousScan 在 App 三端均保持会话;HarmonyOS 使用持续 ReaderMode 接收发现事件,Android / iOS 按各自原生方式等待移卡及下一张标签。

模块四:写入前检查标签,按需格式化

适合标签来源不统一、需要先判断是否可写的业务。会话内使用:先启动会话,发现标签后查询状态。

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { getNdefStatus } from '@/uni_modules/lizhao-nfc-pro'

getNdefStatus({
  success: (status) => {
    console.log('已格式化为 NDEF:', status.formatted)
    console.log('可读取 / 可写入:', status.readable, status.writable)
    // -1 表示无法取得容量,不能按 0 容量处理。
    if (status.capacity >= 0) console.log('标签容量(字节):', status.capacity)
  },
  fail: (err) => {
    console.error('查询标签状态失败:', err.errCode, err.errMsg)
  }
})

HarmonyOS 的 capacity 当前为 -1;iOS 此查询不额外读取内容,messageSize 为 -1。状态检查不能代替写入回调,查询后移卡或标签改变仍可能导致写入失败。

写入方式 使用条件 平台
writeNdef / writeNdefOnce 已格式化为 NDEF 且可写 Android / iOS / HarmonyOS
formatAndWriteNdef 支持格式化的空白标签,由业务明确发起 Android / HarmonyOS

如果确认是自己的空白测试标签、canFormat 为 true,可在明确的“格式化写入”按钮中使用下面片段;不要在发现未知卡片后自动格式化。

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { buildTextRecord, formatAndWriteNdef } from '@/uni_modules/lizhao-nfc-pro'

// 已有活动标签时调用;先备份测试标签原内容。
formatAndWriteNdef({
  records: [buildTextRecord({ text: '测试标签 A-1001' })],
  success: (res) => { console.log('格式化写入完成:', res.message) },
  fail: (err) => { console.error('格式化写入失败:', err.errCode, err.errMsg) }
})

模块五:在自己的页面中管理读卡会话

适合要保留“开始 / 停止”按钮、持续显示读卡结果,或在同一张标签上执行多次操作的页面。先注册标签监听,再启动会话;在标签回调中执行 readNdef、writeNdef 或技术指令。

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import {
  startNfcSession, stopNfcSession,
  onTagDiscovered, offTagDiscovered, readNdef, NfcTagInfo
} from '@/uni_modules/lizhao-nfc-pro'

// 页面进入时注册一次,当前标签仍贴近时读取内容。
const handleTag = (tag: NfcTagInfo): void => {
  console.log('发现标签:', tag.uidHex)
  readNdef({
    success: (res) => { console.log('读取到的 NDEF 记录:', res.records) },
    fail: (err) => { console.error('读取失败:', err.errCode, err.errMsg) }
  })
}
onTagDiscovered(handleTag)

function startReadSession(): void {
  startNfcSession({
    keepSessionAlive: true,
    alertMessage: '请将标签靠近手机',
    success: () => { console.log('会话已启动,等待标签') },
    fail: (err) => { console.error('启动失败:', err.errCode, err.errMsg) }
  })
}

function disposeReadSession(): void {
  // 页面卸载时精确退订,并停止会话。
  offTagDiscovered(handleTag)
  stopNfcSession({})
}

“开始”按钮调用 startReadSession(),页面卸载时调用 disposeReadSession()。iOS 自动移卡换卡应使用模块三的 continuousScan。

startNfcSession.success 表示会话启动,标签结果来自监听器。活动标签有有效时间窗,默认 activeTagTtlMs 为 30 秒;读写时还必须保持标签贴近。页面退出、会话终止或标签过期后,不能继续使用旧标签。

需要记录会话关闭、取消、超时时,可注册状态监听:

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import {
  onNfcSessionStateChange, offNfcSessionStateChange, NfcSessionStateEvent
} from '@/uni_modules/lizhao-nfc-pro'

// 注册后先收到当前状态快照,后续收到状态变化。
const handleState = (event: NfcSessionStateEvent): void => {
  console.log('会话状态:', event.state, event.reason)
}
onNfcSessionStateChange(handleState)

function disposeStateListener(): void {
  // 与标签监听一样,页面卸载时使用原函数引用退订。
  offNfcSessionStateChange(handleState)
}

模块六:保存自定义内容、解析多条记录

适合需要保存 JSON 数据、自定义设备标识或处理完整 NDEF 消息的业务。构造与解析函数同步返回结果,本身不启动读卡会话。

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import {
  buildMimeRecord, buildExternalRecord, parseNdefMessage
} from '@/uni_modules/lizhao-nfc-pro'

// 载荷是 UTF-8 字节的十六进制;这里的内容为 {"ok":true}。
const jsonRecord = buildMimeRecord({
  mimeType: 'application/json',
  payloadHex: '7B226F6B223A747275657D'
})
const deviceRecord = buildExternalRecord({
  domain: 'example.com',
  type: 'device',
  payloadHex: '4131303031'
})

// 保存这些记录需要再交给 writeNdef 或 writeNdefOnce。
console.log('待写入记录:', jsonRecord, deviceRecord)
const parsed = parseNdefMessage({ rawMessageHex: 'D101085402656E48656C6C6F' })
console.log('解析后的文本:', parsed.firstText) // Hello

payloadHex 是字节的十六进制表达,不能直接填 JSON 文本。parseNdefMessage 可接收 records 或 rawMessageHex;非法原始消息可能返回公共结构化结果,不能只凭没有抛错就判断字节消息合法。

Android / iOS 写入前会检查整组记录。空数组、非法或奇数位 payloadHex / id、超过 63 字节的 Text 语言标记、矛盾的 TNF,以及独立使用 unchanged / reserved,会返回 9060013。合法的空载荷和空 ID 可以使用;ID 和实际 type 最多各 255 字节。hex 字段允许空格、换行、冒号、短横线、逗号和 0x 前缀。

手工构造 raw / External / absolute-uri 记录时,iOS 的 type 保留既有 hex 优先解码规则,Android 按文本字节处理;MIME type 两端均为文本。需要跨端相同的常见记录时优先使用上面的记录构造器,专业原始记录应按卡片协议分别确认字节。

文本默认使用 utf-8,需要 UTF-16 时显式传 encoding: 'utf-16'。记录 ID 使用偶数位十六进制;MIME / External 构造器可直接传 id,空 ID 和空 MIME 载荷保留为空。HarmonyOS 也保留自定义 Text / URI 记录的 ID,并按 UTF-8 字节检查语言字段最多 63 字节、type 最多 255 字节;各端已有原始 type 编码约定保持。

模块七:发送 APDU 或其他卡片指令

适合已经掌握卡片协议的专业业务。会话内使用:先检查标签 techs 和 getNfcCapabilities,确认设备和卡片支持对应技术,再发送指令。

下面只演示选择 NFC Forum NDEF 应用;它不是适用于所有卡片的通用读卡命令。

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { isoDepTransceive } from '@/uni_modules/lizhao-nfc-pro'

isoDepTransceive({
  hex: '00A4040007D276000085010100',
  success: (res) => {
    // 响应内容和状态字仍需按卡片协议判断。
    console.log('APDU 响应:', res.bytesHex)
  },
  fail: (err) => {
    console.error('APDU 交互失败:', err.errCode, err.errMsg)
  }
})
卡片技术 调用方法 接入条件
ISO-DEP / ISO 7816 isoDepTransceive 已知 APDU 协议;iOS 还需对应业务 AID 配置
NfcF / FeliCa nfcFTransceive 已知 System Code、服务码与命令格式
NfcV / ISO 15693 nfcVTransceive 按协议设置请求标志、命令与寻址数据
NfcA / NfcB nfcATransceive / nfcBTransceive Android / HarmonyOS 支持;iOS 不提供通用原始指令接口

ISO15693 在 Android 使用原始指令帧。iOS 会把支持的标准命令映射到 Core NFC 方法;两端的帧约定通过 nfcVFrameFormat 明确选择:默认 platform 保留各端已有调用,跨端发送 Android 格式时显式设为 android。这不会让 iOS 支持任意原始命令。

ISO15693 命令 iOS 支持范围
20 读单块 单字节块号;支持 option 返回真实块安全状态
21 写单块 单字节块号;先核对卡片实际块大小;不支持 option
23 读多块 单字节起始块及“块数减一”;不支持 option
A0~DF 厂商自定义 platform 的尾部为原有业务参数;android 的非寻址帧需要厂商码,校验后由系统插入一次
2B、扩展 / select、其他未列命令 明确返回不支持;不构造假的系统信息或响应

标准命令可验证寻址帧的 UID,UID 必须匹配当前标签的 ISO15693 线序(小端);iOS 自定义指令的 android 寻址帧本版不支持。标准命令成功的 bytesHex 为 00 加实际数据,写单块成功为 00;厂商自定义仍返回原有 Core NFC 业务数据,不额外补 00。卡片错误通过 fail 返回,不返回伪造的原始错误帧。

例如,在已发现 ISO15693 标签的会话内读取第 0 块:

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { nfcVTransceive } from '@/uni_modules/lizhao-nfc-pro'

nfcVTransceive({
  hex: '022000',
  nfcVFrameFormat: 'android',
  success: (res) => { console.log('第 0 块响应:', res.bytesHex) },
  fail: (err) => { console.error('读取失败:', err.errCode, err.errMsg) }
})

通信成功只代表取得响应;卡片是否接受命令、返回何种业务数据,需要自己的协议解析。不要向未知卡片发送修改、锁定或擦除命令。

CPU 卡与实体公交卡补登对接

ISO14443 描述底层通信。支持 ISO-DEP 的 CPU 卡应用通常通过 APDU 交互;Classic 的扇区 Key A/B 鉴权不能代替 CPU 卡应用认证。技术列表同时出现 isoDep 和 mifareClassic 时,按目标应用协议选择接口,不根据列表推断厂商或充值权限。

Android 的标签回调和 getLastTag 返回可选的 androidTechnology:包含 atqaHex、sakHex、isoDepAvailable、historicalBytesHex、hiLayerResponseHex、maxTransceiveLength 和 extendedLengthApduSupported。这些值来自 SDK 缓存,查询不会发送探测指令。atqaHex 保留 SDK 字节顺序;historicalBytesHex 只是历史字节,不是完整 ATS。UID 和这些参数都不能用于确认充值订单对应的真实卡账户。

对接分多步的卡片业务时,可保留首次确认卡片的 tagToken,随后将它传入 isoDepTransceive.expectedTagToken。以下函数只发送一条已取得协议的指令;调用前必须已启动会话并取得标签,commandHex 由业务协议提供:

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { isoDepTransceive } from '@/uni_modules/lizhao-nfc-pro'

function sendBoundCommand(tagToken: string, commandHex: string) {
  isoDepTransceive({
    expectedTagToken: tagToken,
    hex: commandHex,
    timeoutMs: 1500,
    success: (res) => {
      // success 只表示通信完成;将真实响应交给已接入的卡应用协议处理。
      console.log('状态字:', res.apduResponse?.statusWord)
    },
    fail: (err) => { console.error('交互已停止:', err.errCode, err.errMsg) }
  })
}
字段 / 结果 含义
expectedTagToken App 三端可选;null/undefined 表示不启用绑定,非 null 时须为非空字符串。无当前标签、重新发现标签、换卡或过期会拒绝,不等待下一张卡。省略时保留各平台原有的等待标签行为
tagToken 仅标识插件本次发现的标签;同 UID 再次发现也会变化。不是物理卡认证、充值授权或多指令事务锁;同一流程应串行调用,不能与其他 NFC 操作交错
bytesHex 原始完整响应,仍包含 SW1/SW2;保持原返回语义
apduResponse App 三端均返回 hasStatusWord、dataHex、sw1、sw2、statusWord、isSuccessStatus、statusMessage
hasStatusWord 仅判断至少两个字节;短响应原样返回,sw1/sw2=-1、状态字为空,不伪造 9000
isSuccessStatus 仅代表 SW=9000;不能单独证明支付、余额持久化或整笔充值完成
61xx / 6Cxx 按卡应用协议处理后续数据或长度;插件不自动发送 GET RESPONSE、不修改 Le、不自动重发
绑定失败 / 通信异常 三端均可复制示例中的请求/回调流水。Android 另有 getNfcDiagnostics().androidIsoDep 原生缓存。sendAttempted=true 只表示已调用收发,是否已写卡可能不确定,应按平台协议查单;不能直接重发加值指令

绑定参数错误返回 9060013,标签不匹配或不可用返回 9060006,仍可识别的过期标签返回 9060007;通信错误保留既有错误分类。绑定流程发生通信异常后,旧标签不能继续使用,应重新发现并按业务平台要求恢复。手机未即时报告离场时,令牌仍可能存在;最终以原生通信结果为准。

两份示例均位于插件的 uni_modules/lizhao-nfc-pro/example/ 目录:uni-app 为 uni_modules/lizhao-nfc-pro/example/uniapp/nfc.vue,uni-app x 为 uni_modules/lizhao-nfc-pro/example/uniappx/index.uvue。两份示例提供相同的功能分组、默认输入、按钮、CPU 绑定发送和分段日志;空块号不会被当成块 0。

三端普通 APDU 的 success 均表示取得真实响应,返回完整 bytesHex 和结构化 apduResponse,不把非 9000 的卡片响应冒充通信异常。iOS 同时支持系统识别为 ISO7816 的标签及 MiFare Plus / DESFire 的 ISO7816 通道;实际卡应用仍受 Core NFC 和发行方协议限制。HarmonyOS 在同次发现的标签上复用 ISO-DEP 连接并串行发送;换卡、清空缓存、停止或切换其他技术时释放。三端均不自动重试或追加指令。

timeoutMs 传入时应为有限正整数。Android / HarmonyOS 设置原生收发超时;iOS 使用插件超时门禁,超时终结本次请求并释放对应会话,不能证明卡片没有执行命令。省略时沿用平台默认处理。收到失败后先核对业务结果,不要直接重复发送写卡命令。

连接恢复的共同操作为“停止会话 → 开始会话 → 移开后重新贴卡 → 等待新标签令牌”。正常连续发送不必重开会话。已有活动会话时重复 startNfcSession 的原行为保留:Android 重建,iOS 返回忙,HarmonyOS 返回已启动;因此不要将重复开始当成三端通用的重置操作。iOS 仍有系统读卡窗口与签名/AID 配置要求,也不支持 Classic。

实体公交卡的“已付款补登”还需要发卡方、运营方或授权服务商提供订单查询、认证交易、写卡结果确认及中断恢复接口或 SDK,以及测试卡和测试订单。本插件目前提供通信与诊断基础,不含这些服务,不提供通用充值函数。取得资料后按其流程完成“确认卡账户和待补登订单 → 认证与写卡 → 卡片结果及平台确认”;若 SDK 已管理 NFC,应按其接入方式避免抢占连接。

没有协议资料时,可先在 uni_modules/lizhao-nfc-pro/example/uniappx/index.uvue 或 uni_modules/lizhao-nfc-pro/example/uniapp/nfc.vue 的“CPU 卡 / ISO-DEP 对接”区域点击“卡片 / APDU 诊断”,再点“复制日志”;无需填写或发送指令。新增诊断的 androidIsoDep 保留最近 24 条事件和最后失败,记录阶段、长度、状态字、耗时及是否已尝试发送,不保存 APDU 或响应数据。旧示例的原始收发日志仍会显示响应内容,转发前按业务要求检查。

模块八:读取 Mifare 标签的块或页

适合明确使用 Mifare 标签的业务。下面为 MifareUltralight 读取示例,在已经发现该技术标签的会话中调用。

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { mifareUltralightReadPages } from '@/uni_modules/lizhao-nfc-pro'

// 示例从第 4 页读取;实际可访问范围按标签规格确认。
mifareUltralightReadPages({
  pageIndex: 4,
  success: (res) => { console.log('页数据:', res.bytesHex) },
  fail: (err) => { console.error('读取页失败:', err.errCode, err.errMsg) }
})

MifareClassic 只在 Android / HarmonyOS 支持:先用合法业务密钥调用 mifareClassicAuthenticate,鉴权成功后再调用 mifareClassicReadBlock 或 mifareClassicReadSector。写块使用 mifareClassicWriteBlock,写页使用 mifareUltralightWritePage。

Classic 写块必须提供 16 字节,Ultralight 写页必须提供 4 字节;卡片锁定位、厂商区、配置页和扇区尾块不能按普通业务数据随意写入。密钥由自己的受控业务提供,不要写进示例或日志。

模块九:根据手机能力显示业务入口

适合在页面进入时判断“是否支持 NFC”“是否需要打开系统 NFC”,并按技术能力显示操作按钮。

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { getNfcCapabilities, getNfcStatus } from '@/uni_modules/lizhao-nfc-pro'

getNfcCapabilities({
  success: (capability) => {
    console.log('支持 NFC:', capability.supported)
    console.log('支持读取 / 写入 NDEF:', capability.ndefRead, capability.ndefWrite)
  }
})
getNfcStatus({
  success: (status) => {
    console.log('系统 NFC 状态:', status.nfcEnabled)
    console.log('授权和会话状态:', status.permissionStatus, status.sessionState)
  }
})

Android 可用 openNfcSettings({}) 引导打开系统设置;iOS / HarmonyOS 不提供插件直达 NFC 开关设置入口。supported 表示能力,nfcEnabled 表示报告的可用状态,二者不能代替真正启动会话后的成功或失败结果。

模块十:取消还在等待贴卡的操作

适合 Android / HarmonyOS 已启动会话、先提交操作但标签还未靠近的业务。使用自己的操作编号,取消尚未开始的请求。

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { readNdef, cancelNfcOperation } from '@/uni_modules/lizhao-nfc-pro'

// 同一个编号关联本次等待操作与取消按钮。
const operationId = 'asset-read-1001'
readNdef({
  operationId,
  success: (res) => { console.log('读取完成:', res.records) },
  fail: (err) => { console.log('读取被取消或失败:', err.errCode, err.errMsg) }
})

// 放到“取消等待”按钮中调用。
cancelNfcOperation({
  operationId,
  success: (res) => { console.log('是否取消了等待操作:', res.cancelled) },
  fail: (err) => { console.error('取消等待失败:', err.errCode, err.errMsg) }
})

cancelled: true 表示从等待队列中取消成功;已经开始的原生读写不会被强制中断。iOS 没有这种预贴卡等待队列,返回 cancelled: false,也不会因此停止读卡会话。该方法用于会话内等待操作,不能代替停止一次性 API 的会话。

模块十一:设置 NTAG215 密码保护

在已开始的会话中发现标签后,由用户明确点击按钮调用。调用方必须确认是真实 NTAG215 测试卡;技术列表包含 MifareUltralight / NfcA 不代表 SDK 能可靠识别 NTAG215 型号。先由业务安全保存密码,再执行写卡。

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { ntag215SetPassword } from '@/uni_modules/lizhao-nfc-pro'

// 仅在用户明确点击“设置密码并启用保护”后调用,示例值请替换为业务保管的密码。
ntag215SetPassword({
  passwordHex: '11223344',
  packHex: 'A1B2', // 可省略,默认 0000;不要记录到日志。
  success: (res) => {
    console.log('NTAG215 保护成功:', res.auth0, res.verificationStatus)
  },
  fail: (err) => {
    // 仅输出安全状态;不能因为失败就自动重新写卡。
    console.error('NTAG215 保护失败:', err.errCode,
      err.details?.stage, err.details?.writeAttempted, err.details?.mayBePartial)
  },
  complete: () => { console.log('NTAG215 密码保护回调完成') }
})

固定策略为 AUTH0=4、PROT=1、AUTHLIM=0:从第 4 页开始读取和写入均须认证,不限制认证失败次数。插件按 PWD → PACK → ACCESS → AUTH0 → PWD_AUTH 的顺序执行,最后核对返回的 PACK;写入保护后立即生效。密码保护不是数据加密,密码只能由业务安全保管,不应记录在日志、诊断或复制报告中。

CFGLCK=1 时预检返回 9060011、reason=configurationLocked,且零写入。四页写入不具备原子性,首次写请求失败也可能实际生效;根据失败详情人工确认,不要自动重试或回滚。本 API 不提供旧密码更改、解锁,也不承诺公共 raw API 在跨连接或重新贴卡后保留鉴权状态。

API 用途速查

不需要一次接入全部方法,按自己的业务选择。下表覆盖全部 38 个公开 API;具体平台支持见后文。

模块 适用业务 常用方法 使用结果
配置与设备状态 设置读卡策略、控制业务入口 configureNfc、getNfcCapabilities、getNfcStatus、openNfcSettings 配置结果、设备能力和当前状态
接入诊断 查询最近一次错误与会话情况 getNfcDiagnostics 脱敏诊断结果与处理建议
一次完成操作 单张识别、读取或写入 scanTagOnce、readNdefOnce、writeNdefOnce 自动清理内部会话后的标签或读写结果
会话控制 自己管理开始和停止 startNfcSession、stopNfcSession 会话启动或停止结果
标签发现 处理每张标签 onTagDiscovered、offTagDiscovered 标签事件与精确退订
会话变化 处理取消、超时和关闭 onNfcSessionStateChange、offNfcSessionStateChange 当前快照与后续状态事件
标签缓存 查询或清除最近一次标签 getLastTag、clearLastTag 标签摘要或清理结果
等待操作 撤回尚未执行的请求 cancelNfcOperation 是否成功取消
会话内 NDEF 查询状态、读取、写入或首次格式化 getNdefStatus、readNdef、writeNdef、formatAndWriteNdef 标签状态或真实读写结果
文本与链接 构造常用 NDEF 内容 buildTextRecord、buildUriRecord 同步返回 NDEF 记录
自定义内容与解析 构造记录、提取文本和链接 buildMimeRecord、buildExternalRecord、parseNdefMessage 同步返回记录或解析结果
技术指令 按卡片协议通信 nfcATransceive、nfcBTransceive、nfcFTransceive、nfcVTransceive、isoDepTransceive 十六进制响应 bytesHex
MifareClassic 鉴权、读写块、读取扇区 mifareClassicAuthenticate、mifareClassicReadBlock、mifareClassicWriteBlock、mifareClassicReadSector 鉴权或块/扇区操作结果
MifareUltralight 读取页、写入页 mifareUltralightReadPages、mifareUltralightWritePage 页操作结果
NTAG215 密码保护 设置密码并启用固定读写保护 ntag215SetPassword PACK 校验结果与固定保护策略

异步 API 的函数本身返回 void,结果从回调取得。记录构造器返回 NfcNdefRecord,parseNdefMessage 返回 NfcParseNdefResult;监听器通过传入函数订阅。

常用配置与参数

通用回调与操作编号

有回调的 API 采用 success / fail / complete。成功和失败只会进入其中一个,complete 在结束时触发,不能作为成功判断;持续标签结果和会话变化来自各自监听器。

参数 类型 必填 说明 默认值 可选参数
success function 否 接收成功结果,结果类型按 API 确定 无 无
fail function 否 接收 NfcFail 失败对象 无 无
complete function 否 成功或失败后的结束通知 无 无
operationId string 否 支持此字段的读写/技术操作编号,便于关联日志和等待取消;只传非敏感追踪编号,不填卡号、订单内容或凭据 自动生成 无

cancelNfcOperation 的 operationId 是必填项。上述回调不适用于同步构造/解析函数;on* / off* 直接传监听函数。offTagDiscovered() / offNfcSessionStateChange() 不传函数会清除该类全部监听,多个页面或模块共用插件时应传入自己的函数。

configureNfc:配置后续会话

多数业务可使用默认值。修改配置影响后续会话,正在运行的会话仍使用启动时的配置。

参数 类型 必填 说明 默认值 可选参数
useReaderMode boolean 否 Android 优先使用 ReaderMode;关闭后使用前台分发 true true / false
keepSessionAlive boolean 否 普通会话发现标签后继续保持 true true / false
activeTagTtlMs number 否 活动标签可操作的时间窗,毫秒 30000 1000~300000
dedupeMs number 否 相同标签的短时间去重窗口,毫秒 Android / HarmonyOS 800;iOS 500 0~30000,0 关闭时间窗口去重
pendingMax number 否 Android / HarmonyOS 等待队列上限 16 正整数
skipNdefCheck boolean 否 Android / HarmonyOS 跳过自动 NDEF 探测;仅在明确不需要内容时设置 false true / false

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { configureNfc } from '@/uni_modules/lizhao-nfc-pro'

// 为之后启动的会话设置去重与活动标签时间窗。
configureNfc({ dedupeMs: 800, activeTagTtlMs: 30000 })

App 三端的超范围有限数值收窄到上述范围;NaN / Infinity 保留此前有效默认。配置修改用于下一次启动,当前会话继续使用启动时的快照。成功回调中的 config 返回归一后的默认配置;iOS 的 Android 专用字段为 useReaderMode: false、skipNdefCheck: false,未提供等待队列,pendingMax 为 0;HarmonyOS 的 useReaderMode 为 false,其 ReaderMode 由平台实现管理。

startNfcSession:普通会话或连续扫描

参数 类型 必填 说明 默认值 可选参数
alertMessage string 否 iOS 系统读卡提示文案 插件默认提示 无
keepSessionAlive boolean 否 本次普通会话保持策略 沿用 configureNfc true / false
continuousScan boolean 否 App 三端持续发现下一张标签;开启时优先保持会话 false true / false
iosContinuousScan boolean 否 iOS 连续扫描兼容别名,新代码使用统一参数 false true / false

continuousScan 不传或关闭时,继续沿用普通会话的保持策略;它不等于把 keepSessionAlive 改为 false。普通会话的 keepSessionAlive: false 用于处理首张标签,保留到首个操作完成或有效时间窗结束后关闭。

一次性识别、读取与写入

参数 类型 必填 说明 默认值 可选参数
timeoutMs number 否 scanTagOnce 等待标签的超时;readNdefOnce / writeNdefOnce 等待首张标签的超时,毫秒 15000 Android / iOS 1000~120000;HarmonyOS 识别入口沿用原范围
alertMessage string 否 iOS 系统读卡提示 插件默认提示 无
operationId string 否 readNdefOnce / writeNdefOnce 操作编号;scanTagOnce 不接收此字段 自动生成 无
records Array<NfcNdefRecord> 写入时是 writeNdefOnce 写入的记录,不能为空 无 文本 / URI / MIME / External / 原始记录
verifyAfterWrite boolean 否 writeNdefOnce 写入后回读同一标签并比较 true true / false

三种入口成功、失败或超时后仅清理自己创建的会话,不停止其他业务的已有会话。等待首张标签的超时不等于每条原生指令的超时。

会话内 NDEF 与标签缓存

参数 类型 必填 说明 默认值 可选参数
records Array<NfcNdefRecord> 写入时是 writeNdef / formatAndWriteNdef 要写入的非空记录数组 无 文本 / URI / MIME / External / 原始记录
operationId string 否 readNdef / getNdefStatus / 写入操作的编号 自动生成 无
includeNdef boolean 否 getLastTag 的兼容保留字段,当前各 App 平台忽略,不触发额外读取 false true / false

getLastTag 返回最近一次发现的标签摘要,不代表标签仍贴近手机;缓存也不能替代 readNdef 的真实读取。clearLastTag 清除缓存,不等于停止会话。

NDEF 构造与解析

参数 类型 必填 说明 默认值 可选参数
text string 是 buildTextRecord 的文本内容 无 无
lang string 否 文本的语言标记 zh-CN BCP 47 语言标记
encoding string 否 文本编码 utf-8 utf-8 / utf-16
uri string 是 buildUriRecord 的链接 无 无
mimeType string 是 buildMimeRecord 的内容类型 无 如 application/json
domain string 是 buildExternalRecord 的业务域名 无 无
type string 是 buildExternalRecord 的自定义类型名称 无 无
payloadHex string MIME / External 是 MIME 或 External 的载荷字节 无 偶数长度十六进制
id string 否 MIME / External 记录标识 空字符串 十六进制
records Array<NfcNdefRecord> 否 parseNdefMessage 的已知记录 空数组 无
rawMessageHex string 否 parseNdefMessage 的原始 NDEF 消息 空字符串 偶数长度十六进制

技术指令与 Mifare 参数

这些参数只用于对应的技术 API,不能混入一次性扫描参数。

参数 类型 必填 说明 默认值 可选参数
hex string 指令 API 是 nfc*Transceive / isoDepTransceive 指令字节;NfcV 至少两个字节 无 偶数长度十六进制
nfcVFrameFormat string 否 仅 nfcVTransceive 使用;选择平台原约定或 Android 原帧 platform platform / android;支持范围见模块七
timeoutMs number 否 指令超时,是否可设置取决于平台能力 平台默认值 正整数
sectorIndex number Classic 鉴权 / 读扇区是 从 0 开始的扇区索引 无 非负整数
keyType string Classic 鉴权是 使用 Key A 或 Key B 无 A / B
keyHex string Classic 鉴权是 6 字节合法业务密钥 无 12 个十六进制字符
blockIndex number Classic 读写块是 从 0 开始的卡片绝对块号,例如扇区 1 使用 4、5、6、7 无 非负整数
pageIndex number Ultralight 读写页是 页索引,具体可访问范围以标签为准 无 0~255 整数
dataHex string 写块 / 写页是 Classic 写块 16 字节;Ultralight 写页 4 字节 无 分别为 32 / 8 个十六进制字符
operationId string 否 对应操作的编号 自动生成 无

ntag215SetPassword:NTAG215 密码保护参数

参数 类型 必填 说明 默认值 可选参数
passwordHex string 是 4 字节密码,归一化后为 8 个十六进制字符 无 允许大小写、空白、冒号、短横线及 0x 前缀
packHex string 否 2 字节 PACK,归一化后为 4 个十六进制字符 0000 与 passwordHex 相同的分隔格式
operationId string 否 业务操作编号,不得包含密码或 PACK 自动生成 无
success (res: NfcNtag215SetPasswordResult) => void 否 写入和最终认证、PACK 匹配均成功后触发 无 无
fail (err: NfcFail) => void 否 检查 details 中的阶段及部分写入风险 无 无
complete (res: any) => void 否 成功或失败后触发一次 无 无

返回结果怎么读

NTAG215 密码保护结果 NfcNtag215SetPasswordResult

字段 类型 说明
platform NfcPlatform 当前 Android / HarmonyOS 平台
action string 固定为 ntag215SetPassword
operationId string 本次业务操作编号
message string 中文结果说明
packHex string 已核对的两字节 PACK;不要写入日志
auth0 number 固定为 4
protectReadWrite boolean 固定为 true,读写均要求认证
authlim number 固定为 0,不限制失败尝试次数
verificationStatus 'matched' PWD_AUTH 返回的 PACK 已匹配
mayBePartial false 成功时固定为 false,失败请检查 error.details

标签结果 NfcTagInfo

scanTagOnce.success、onTagDiscovered 和 getLastTag.success 返回标签对象。

字段 类型 说明
uidHex string 标签 UID 的十六进制表达
idBase64 string 标签标识的 Base64 表达
techs Array<NfcTech> 真实识别到的技术类型,用于选择后续操作
ndef boolean 是否检测到 NDEF
ndefText / ndefUri string 可取得的首个文本 / URI;可能为空
platform NfcPlatform 当前平台
timestamp number 标签发现时间戳
action / sessionId string 发现来源 / 所属会话
extras any / null 平台扩展信息

NDEF 记录 NfcNdefRecord

字段 类型 说明
kind NfcNdefRecordKind text / uri / mime / external / absolute-uri / raw
tnf NfcNdefTnf NDEF 类型格式:empty / wellKnown / mime / absoluteUri / external / unknown / unchanged / reserved
type string 记录类型
id string 记录标识的十六进制表达
payloadHex string 原始载荷字节的十六进制表达
text / uri string,可选 解析出的文本 / 链接
mimeType / lang / encoding string,可选 MIME 类型 / 文本语言 / 文本编码

读写与技术操作结果

API / 返回类型 主要字段 如何使用
readNdef 等 / NfcOperationResult success、platform、action、operationId、tag、records、bytesHex、message NDEF 读取看 records,技术指令与块/页读取看 bytesHex
configureNfc / NfcOperationResult 可选 config App 三端返回归一后的后续会话默认配置,当前会话快照保持不变
readNdefOnce / NfcReadNdefOnceResult tag、records、bytesHex、sessionId、operationId、message 使用本次实际读取的记录
writeNdefOnce / NfcWriteNdefOnceResult writeCompleted、verificationRequested、verificationStatus、verified 判断写入完成与回读一致是两个结果
writeNdefOnce 的内容对比 tag、bytesHex、expectedRecords、actualRecords、actualBytesHex 对比本次期望内容和实际回读内容
writeNdefOnce 的回读说明 verificationErrorCode、verificationErrorMessage、mismatchReason 排查回读失败或不一致,不自动重复写入
getNdefStatus / NfcNdefStatusResult tag、formatted、readable、writable、capacity、messageSize、ndefType、canFormat、canMakeReadOnly 判断标签状态;未知容量或消息长度用 -1 表示
cancelNfcOperation / NfcCancelOperationResult operationId、cancelled、message 查看等待请求是否已取消
parseNdefMessage / NfcParseNdefResult records、firstText、firstUri、rawMessageHex 获取全部记录或首个文本、链接

设备、会话与诊断结果

查询 关注字段 用途
getNfcCapabilities supported、ndefRead、ndefWrite、ndefFormat、技术名称字段 判断平台和技术能力
getNfcCapabilities 的运行条件 settings、pendingOperations、requiresPermission、requiresCustomBase、restrictedReason 判断设置入口、等待队列与平台限制
getNfcStatus supported、nfcEnabled、permissionStatus、sessionState、activeTagAvailable、activeTagExpiresAt、message 当前设备与会话状态
onNfcSessionStateChange previousState、state、reason、sessionId、可选 errCode、message 处理会话变化;注册后先收到快照
getNfcDiagnostics platform、sessionState、pendingOperationCount、lastError、recommendation 排查最近一次接入错误;iOS 还可返回 iosSession 摘要

会话状态为 idle / starting / active / stopping / closed。权限状态为 notRequired / granted / denied / notDetermined / missingCapability / unsupported;iOS 的 notDetermined 不代表已被拒绝,也不代表已经授权。

支持平台

以下能力用于 App 真机;Web 和小程序不提供本插件的原生 NFC 标签读写。

能力 Android iOS HarmonyOS
单次识别、会话与标签发现 支持 支持 支持
NDEF 读取与写入 支持 支持已格式化且可写标签的写入 支持
写入后真实回读 支持 支持 支持
continuousScan 移卡换卡 支持 支持,受系统前台会话限制 支持,通过 ReaderMode 保持接收
格式化并写入 NDEF 支持 不支持 支持
预贴卡等待与精确取消 支持 不维护此等待队列 支持
直达 NFC 设置 支持 不支持 不支持
NfcA / NfcB 原始指令 支持 可识别,不开放通用原始指令 支持
NfcF / FeliCa 支持 支持,需有效业务 System Code 支持
NfcV / ISO 15693 原始帧 标准 20/21/23 及受限厂商自定义,见模块七 原始帧
ISO-DEP / ISO 7816 APDU 支持 支持,需业务 AID 支持
MifareClassic 支持,依赖设备能力 不支持 支持,依赖设备能力
MifareUltralight 读页 / 写页 支持 支持 支持
NTAG215 密码设置 ntag215SetPassword 支持 不支持,返回 9060001 支持

平台支持不等于每部手机支持所有卡片。接入前查询 getNfcCapabilities,发现标签后再检查 techs。iOS 的 rawTransceive: false 只表示没有通用原始指令能力,不能据此隐藏 NfcF、NfcV、ISO7816 或 MifareUltralight 的专用操作。

  • Android:需要具有 NFC 的手机,开启系统 NFC,并在原生包中包含 NFC 权限与能力声明。
  • iOS:使用支持 Core NFC 的 iPhone;最终应用的 NFC 使用说明、NFC Tag Reading 能力和签名描述文件必须一致。ISO7816 使用对应业务 AID,FeliCa 使用合法的四位十六进制 System Code;FFFF / FFxx / xxFF 不能作为通配配置。
  • HarmonyOS:需要设备提供相应 NFC 能力,并在应用中声明 ohos.permission.NFC_TAG。

iOS 未配置有效 FeliCa System Code 时,NfcF / Type 3 标签不可发现;普通 ISO14443 / ISO15693 路径不因此关闭。普通读卡流程不支持支付应用选择,应使用自己业务合法的 AID。

FeliCa System Code 使用四位十六进制离散值,不使用 FFxx / xxFF 字节通配值;0FF0 是合法的离散值,仍需与业务卡片匹配。

iOS 宿主需启用 NFC Tag Reading 能力,并确认描述文件与最终签名中的 com.apple.developer.nfc.readersession.formats 包含 TAG。UTS.entitlements 是插件参与原生合并的配置文件,最终授权以应用签名和描述文件为准。

ntag215SetPassword 在 Web、微信小程序、支付宝小程序同样返回 9060001,不会模拟写卡成功。

错误码说明

失败对象包含 errSubject、errCode、errMsg 和 details。业务按 errCode 分支处理,details 中的 platform / apiName / nativeCode / nativeMessage / tech / reason 用于辅助排查。

错误码 含义 说明
9060001 平台或设备不支持 检查是否为支持 NFC 的 App 真机
9060002 原生运行环境不可用 确认应用和读卡页面处于可用状态
9060003 权限或签名能力不足 检查系统授权、iOS 能力与描述文件、平台配置
9060004 系统 NFC 未开启 打开系统 NFC 后重试
9060005 会话未运行 会话未启动、已关闭或等待操作被取消
9060006 没有可用标签 等待发现标签,保持贴近后操作
9060007 活动标签已过期 超过有效时间窗,需要重新贴卡
9060008 标签技术不匹配 当前标签不支持要调用的技术
9060009 鉴权失败 检查 MifareClassic 密钥、扇区与访问条件
9060010 操作期间标签离场 重新贴近标签,确认上次结果后再操作
9060011 写入失败 检查格式、可写性、容量和贴卡状态
9060012 格式化写入失败 检查标签是否支持格式化,不对未知标签重试
9060013 参数或数据不合法 检查必填字段、字节长度与 NDEF 内容
9060014 指令交互失败 检查卡片协议、指令与感应状态
9060015 读卡器忙 已有业务会话、操作冲突或等待队列已满
9060016 等待或会话超时 本次已结束,可由用户重新发起
9060017 平台未提供该能力 查询能力矩阵,选择支持的操作

NTAG215 失败详情

ntag215SetPassword 的 error.details 提供以下安全状态。字段尚未产生时可能省略,不能把字段缺失解释为写卡成功。

字段 类型 说明
stage string 失败阶段:validate、queue、preflight、writePwd、writePack、writeAccess、writeAuth0、verify
writeAttempted boolean 是否已尝试写入;true 不代表芯片已确认
mayBePartial boolean true 表示可能有页面已生效,须人工确认,禁止自动重试或回滚
verificationStatus 'matched' / 'failed' / 'notRequested' 最终认证校验状态;尚未进入认证为 notRequested
reason string CFGLCK=1 时为 configurationLocked,预检拒绝且没有写入

参数不合法返回 9060013,配置读取或保护配置写入失败返回 9060011,标签离场返回 9060010,认证交互异常或 PACK 不匹配可能返回 9060014 / 9060011。会话、超时和取消仍使用既有错误码。失败并不等于卡片未改变,尤其首次写入请求送出后无法单凭异常确认芯片状态。

errSubject 为 lizhao-nfc-pro。

注意事项

  • Android UTS 原生代码更新后,请重新原生联编或安装与当前源码匹配的自定义基座;页面热更新不能更新原生代码。

  • 首次接入或更新原生 NFC 能力、权限、签名配置时,需要重新原生联编或制作并安装对应平台自定义基座;页面热更新不能更新已编入原生包的 NFC 能力。

  • Classic 普通数据块自动回读校验仍为 Android 能力;HarmonyOS 写入指令完成后应显式读回核验,iOS 不支持 Classic。

  • 页面退出时停止自己管理的会话,并用原监听函数精确退订。应用中同时存在多个 NFC 页面时,应集中管理会话,避免互相停止。

  • 每次只放一张标签,读写完成前保持贴近感应区。标签离场后先确认上次写入结果,不自动重复写入或对旧标签持续重试。

  • UID 不能单独作为门禁授权、支付或防伪凭证。写入前备份原内容,确认容量、锁定位与访问条件,只在合法可操作的标签上使用。

  • 正式使用前,按目标手机和实际标签验证读取、写入、取消与恢复流程;模拟器不能证明真实 NFC 通信可用。

常见问题

问题 处理方法
能识别 UID,为什么没有文本? UID 与 NDEF 是不同内容;用 readNdefOnce 读取标准 NDEF,非 NDEF 卡片按自己的技术协议处理
startNfcSession 成功,为什么没有读卡内容? 它只返回启动结果;先注册 onTagDiscovered,等待标签事件,再进行会话内操作
连续扫描为什么要先移开标签? 连续模式等待下一张标签;同一卡短时间会去重,业务也需要自己的重复采集规则
一次性读取提示 9060015? 等已有操作结束或停止自己管理的会话,再调用一次性 API;不要同时开启两种流程
写入成功,为什么还显示回读未完成? 原生写入与内容确认是两个阶段;检查 verificationStatus,不要把回读失败当成需要立即再次写入
iOS 能读取 NDEF,为什么不能格式化或操作 Classic? 系统不提供这些能力,按支持平台表选择 API
最近一次标签还在,为什么操作失败? 缓存不代表实体标签仍在感应区,还可能已过期;重新贴卡并检查会话状态
手机 NFC 已开启,仍然无法启动? 查询诊断与失败 details,检查平台授权和签名条件

需要定位问题时,在失败后查询诊断:

以下代码若含 UTS 类型标注,适用于 uni-app x;普通 uni-app 请使用本插件对应 JS 示例。

import { getNfcDiagnostics } from '@/uni_modules/lizhao-nfc-pro'

getNfcDiagnostics({
  success: (res) => {
    console.log('当前会话状态:', res.sessionState)
    console.log('最近错误:', res.lastError)
    console.log('处理建议:', res.recommendation)
  }
})

诊断不包含标签内容、APDU 或密钥,自己的业务日志也应避免记录这些敏感信息。

Android 升级后进入页面报 NfcTagInfo / NoSuchMethodError

这类错误发生在页面创建标签对象时,表示页面调用的原生构造方法与 APK 中实际的类不一致。它发生在读卡之前,与扇区、密钥、卡片协议无关。标签包含可选的 tagToken、androidTechnology;页面仍可只填写原有字段,但页面代码与原生插件需要一起重新编译。仅凭错误截图不能确定是哪一份缓存或打包输入不一致。

  1. 确认项目的完整 uni_modules/lizhao-nfc-pro/ 已更新到同一版本,不混用不同版本的接口文件和平台文件;保留业务页面原有初始化写法。
  2. 在 HBuilderX 的 Android 运行窗口勾选“清理构建缓存”,并执行一次完整运行,等待控制台显示编译完成后再停止运行,让页面与插件重新生成。仅勾选复选框而不执行运行不会完成清理。请使用同一 HBuilderX 版本完成后续构建。
  3. 正式 APK 出错:清理后重新执行“发行 → 原生 App-云打包”,安装新生成的正式 APK 再进入 NFC 页面。只更新页面资源、WGT 或重启旧 APK 不能替换其中的原生类。
  4. 自定义基座调试出错:重新制作并安装本项目的 Android 自定义基座,运行时选择“自定义基座 → 本地基座”,并完成页面资源的重新编译与同步。普通模式和蒸汽模式需使用各自对应的基座。
  5. 若全量重新打包后仍出错,请保留第一条完整异常、HBuilderX 版本、插件版本、普通/蒸汽模式以及该次 APK 的生成时间。页面可以打开后,点击“接入诊断”,buildMarker 应与当前插件构建标记一致。

无需为消除这个错误,把 ref<NfcTagInfo>({...}) 改成其他类型或补写可选字段。插件版本号更新本身也不会修复已经安装的旧 APK。

CPU 卡为什么提示 Classic 鉴权失败?诊断会执行鉴权吗?

先看实际 API 和错误码。若标签技术只有 isoDep,nfcA,调用 mifareClassicAuthenticate 返回 9060008,表示标签未提供 Classic 技术,尚未执行扇区密钥鉴权。9060009 才是 Classic 鉴权被拒绝。ISO14443-4 / ISO-DEP 使用 APDU 交互,CPU 卡应用认证需按发行方协议完成;更换 Classic Key 或延长会话不能把这两个流程转换为同一种认证。技术列表同时包含 isoDep 和 mifareClassic 时,按实际应用协议选择,不能直接禁用 Classic。

两套示例的“CPU 卡 / ISO-DEP 对接”区域都提供以下入口:

  1. 没有发行方协议:开始会话 → 贴卡 → 卡片 / APDU 诊断 → 复制日志。诊断仅读取缓存技术参数,不发送探测 APDU,也不会执行 CPU 卡应用鉴权。
  2. 已有发行方协议:填写协议规定的 APDU,再点“绑定当前卡发送”。通信结果、状态字、应用鉴权与充值结果应按业务协议分别判断;示例不会自动执行一套通用认证或补登充值流程。

示例中,“当前状态”会显示最后发现标签的协议提示,“Classic 扇区鉴权”按钮仍调用原插件 API,便于验证真实失败回调。日志开头包含示例版本、本页诊断次数及 APDU 请求数;计数只记录本页操作,不是鉴权或充值成功次数。短摘要不重复展开 lastError.reason 中的长原生事件,ISO-DEP 日志置于完整 Classic 日志之前。

请使用示例“复制日志”按钮的完整输出,保留开头的示例版本和诊断获取状态。若只复制一条“接入诊断”控制台输出,或文件在 JSON 字符串中间结束,不能把后半段缺失当作没有 APDU 记录。

客户遇到问题,怎样一次提供完整日志?

uni-app x 使用 uni_modules/lizhao-nfc-pro/example/uniappx/index.uvue;uni-app 使用 uni_modules/lizhao-nfc-pro/example/uniapp/nfc.vue。示例的完整报告格式为 nfc-example-report-v3,页面版本与原生 buildMarker 会分别记录,便于检查页面、插件和基座是否匹配。

  1. 开始会话、贴卡,按实际业务步骤复现一次问题;保留页面,不用先清屏。
  2. 点击“复制日志”,把完整文本粘贴发送。报告应同时有同一编号的 NFC报告开始 和 NFC报告结束;即使清屏过,仍可复制当前原生诊断与本页保留的 APDU 流水。
  3. 如聊天软件截断长文本,可粘贴到 TXT 文件后发送文件,或点击“复制下一段”,每次粘贴发送一段,直到 N/N。每段正文最多 6000 个 UTF-16 字符,带报告编号、序号、总段数及结束标记;复制失败或 3 秒未回调不会跳过该段,可重试。
  4. 分段发送期间不要再次点击“复制日志”,否则会生成新快照并从第 1 段重新开始。已有分段不会随新读卡操作变化;全部复制后再点“复制下一段”会从第 1 段重发。

报告包括设备/系统与编译运行环境、页面/原生版本、缓存标签协议/会话/令牌、非敏感表单参数、原生异常、Classic 与 ISO-DEP 原生诊断、页面事件,以及每次 APDU 的入口、operationId、头部/长度、超时、总耗时、响应长度/状态字和成功/失败/complete 回调次数。页面事件和 APDU 时间使用带毫秒的 UTC 时间;APDU 总耗时含等待标签和排队,原生 I/O 耗时单独见原生诊断。表单快照不代表实际已发请求,以流水为准。

APDU 流水在本页保留最近 120 条并标明省略数,“清屏”只清除页面显示;退出重进页面会重新计数。新增流水不记录 APDU 数据区、响应载荷或 Classic 密钥;异常自由文本中连续 8 位以上的十六进制、4 字节以上的分隔十六进制及以 PIN / password / key 等标注的值会脱敏,摘要与完整错误使用同一规则。单条 APDU 错误详情超过 8000 字符会明确标记截短,原生缓存报告继续单独保留。没有回调、回调重复、只有 complete 或原生诊断查询失败/超时都会留下可识别的状态;复制诊断不会额外发送卡片指令。

Classic 鉴权成功但读块失败:复制完整诊断日志

Classic 读写块的 blockIndex 是整张卡的绝对块号。鉴权扇区 1 后,读三个数据块分别传 4、5、6;7 是该扇区的尾块,保存访问条件和密钥区域,读取权限由卡片访问条件决定。传 1、2、3 会操作扇区 0,填写的鉴权扇区号不会自动转换读写块号。Classic 4K 的扇区 32 起每区 16 块,不能对所有扇区统一使用“扇区号乘 4”计算。

Android 的 mifareClassicWriteBlock 对可确认的普通数据块自动执行写前原 Key 鉴权、一次写入、写后原 Key 鉴权和同一绝对块的 16 字节回读比对;仅比对一致后进入 success,message 明确“回读校验一致”。bytesHex 仍为本次提交的数据。没有当前连接、会话、标签代次和扇区的匹配凭据时不猜测 Key,沿用原 SDK 鉴权状态执行一次写入与回读校验;失败进入 fail。回读不一致返回 9060011;写入已发送但掉场、鉴权或回读失败时,结果可能不确定,应查看完整诊断,不自动重复写入。

块 0、扇区尾块和无法确认元数据的目标保留原有写入指令语义,成功消息明确“未执行回读校验”,不能当成完整内容已校验。尾块密钥的读取值可能被屏蔽,不能直接与写入的 16 字节比较;此类操作及异常会清理原凭据。写入尾块后继续操作须用当前密钥重新鉴权。HarmonyOS 的写块结果保持原语义,需要业务自行回读;iOS 不支持 Classic。

复测写入时先记录原值,再写入另一组 16 字节数据;重复提交卡内已有内容无法证明写入过程实际生效。普通块的回读一致只说明当前回读内容匹配,长期保存仍可移卡后用独立读卡器确认。

Android Classic 失败会在已有 details.reason 中附带 Classic诊断= JSON,失败后查询 getNfcDiagnostics 可从 lastError.reason 取得失败快照,也可从可选的 androidClassic JSON 文本取得原生事件及独立保留的最后一次 Classic 失败。即使页面序列化的 UniError 只有 errCode、errMsg、errSubject,也能通过 androidClassic 导出原生详情。其他平台或旧基座可能没有此字段。

读块和读扇区在同一次原生任务中,会使用当前连接、会话及标签代次下该扇区之前鉴权成功的原 Key,再鉴权一次后立即读取;没有匹配记录时保留原读取路径。恢复鉴权失败则结束本次读取,不自动更换 Key,也不重试失败的 READ 或写入。原 errCode、errMsg、nativeCode、nativeMessage 保持原义,单独鉴权和读块的调用方式保持不变。

两套原示例的“复制日志”会先刷新原生诊断,再把设备/运行版本、原生诊断和按发生顺序排列的页面日志一起导出。刷新失败、异常或 2 秒未返回时仍复制已有日志,并明确标记缓存或缺失状态。页面只显示诊断摘要,完整原生内容保留在复制结果中。新增原生诊断不记录密钥、块内容、APDU 或设备唯一标识;原有业务成功日志仍可能包含读取结果,转发前按业务要求检查。complete 仅表示调用结束,不能代替成功回调。

客户复测时:

  1. 更新插件后重新原生联编,或重新制作并安装匹配的 Android 自定义基座;只热更新示例页面无法增加原生日志。
  2. 使用实体 Mifare Classic 卡,确认发现标签的技术列表包含 mifareClassic;鸿蒙 HceService 的 ISO-DEP/APDU 模拟不能替代 Classic 卡验收。
  3. 点“清空”和“开始会话”;贴卡并保持不动,点击原“Classic 鉴权”,随后点击原“Classic 读块”。默认扇区 1 对应绝对块 4~7,示例默认读块 4。
  4. 成功或失败后点击一次“复制日志”,回传整段文字即可,无需另外抓取控制台或先点“接入诊断”。不要退出 App 后再复制,以免进程结束导致内存诊断丢失。

如果此前把示例复制到了自己的业务页面,更新插件后也要同步业务页中的参数日志、诊断查询和复制处理,或直接运行 uni_modules/lizhao-nfc-pro/example/uniappx/index.uvue / uni_modules/lizhao-nfc-pro/example/uniapp/nfc.vue 核对。复制文本第一行的示例路径是固定文字,不表示 App 当前实际运行的页面路径或页面版本;只有倒序业务日志而没有下列诊断头时,需要核对实际使用的复制入口。

复制结果的示例标记为 classic-report-v2;androidClassic.nativeBuildMarker 应为 classic-report-v2+20261009,classicReadCompatibility 应为 same-key-before-read-v1。这三项分别核对页面、原生诊断和读前鉴权策略,不能只根据插件版本号判断基座已更新。单次请求的 Classic诊断= 保留原 classic-log-v1 字段,并增加以下信息:

Android 普通数据块的写前鉴权及写后校验,通过运行诊断返回的构建标记和 classicWriteCompatibility: same-key-write-verify-v1 同时核对;缺少对应标记时不能仅凭页面或插件版本判断能力已进入基座。

字段 用途
stage / connection 区分参数校验、等待标签、连接、鉴权、读写;连接是 new 还是 reused
operationId / sessionId / tagGeneration / connectionId 对应具体请求、会话、标签代次和原生连接;同 UID 重发现也会有新的代次
sectorIndex / blockIndex / blockSectorIndex 核对鉴权扇区和绝对块所属扇区;不适用的索引为 -1
targetSectorAuthRecorded / targetAuthKeyType / targetAuthAgeMs 当前连接是否记录目标扇区鉴权成功、使用的 Key 类型及间隔;支持同连接多个扇区的独立记录
lastSuccessfulAuth / authResetReason 区分历史鉴权成功与重新发现、切换技术、重连或后续鉴权失败造成的记录失效
readAuthResult 区分读前鉴权未执行、无匹配记录、恢复 Key A/B 成功、被拒绝、上下文失效或原生异常
writeAuthCachePolicy 写前策略:普通数据块为 preservedDataBlock;块 0、尾块或无法分类分别清理恢复凭据;后续失败清理限定原凭据代次
writeInvoked / writeCompleted / writeOutcome 是否进入 SDK 写入、SDK 是否正常返回、事务最终结果;SDK 返回正常不单独代表回读一致
writeAuthResult / verifyAuthResult 分别记录写前与校验前的同 Key 鉴权结果;不记录密钥值
writeVerification matched 为回读一致,mismatched 为不一致,incomplete 为无法完成校验;notApplicableSpecialBlock / notApplicableUnknownBlock 为未执行校验
writeAuthDurationMs / writeDurationMs / verifyAuthDurationMs / verifyReadDurationMs 分开记录写前鉴权、写入、校验前鉴权和回读耗时;-1 表示未进入
verifyReadLength / firstMismatchIndex 实际回读长度与首个不一致字节的零起始下标;不记录块内容
queueWaitMs / connectDurationMs / authDurationMs / readAuthDurationMs / readDurationMs 分开记录请求等待、连接、原鉴权、读前鉴权和读取耗时;使用单调时钟,-1 表示未进入该阶段
currentBlockIndex / readBlocksCompleted 读扇区中具体失败的绝对块号及已成功读取的块数
technology SDK 报告的 Classic 类型、容量、扇区/块数、超时配置以及 NfcA SAK/ATQA;字段不可用会明确标记
sessionState / closePending / tagTtlRemainingMs 失败时的会话、释放和缓存有效期,区分失败现场与后来发生的 TTL 清理
nativeCode / nativeMessage / nativeException SDK 异常类型、消息及有界 cause/堆栈,区分掉场、权限及通信失败

原生缓存最多保留 48 条事件,事件文字总量最多 65536 个 UTF-16 字符;单条事件上限 8192 字符。lastFailure 独立保留最后一次 Classic 失败,最多 16384 字符,后续 TTL、成功或会话停止不会覆盖它。droppedEvents、truncatedEvents、truncatedFailures 和事件自身的 truncated 明确说明是否有内容被挤出或截断。页面日志保留最近 80 条,复制结果同时报告省略条数;“清空”只清页面日志,核对失败时应使用请求编号和时间。

鉴权观察记录不能证明射频一直稳定,也不能保证该 Key 拥有块读权限;需要结合原生异常及实际卡的访问位分析。示例 lastDiscovered* 是最后发现记录,不能当作当前标签仍有效;以本次失败快照和接入诊断为准。

作者系列 UTS 插件

以下为作者已上架的 UTS 插件,详情见各市场页面或作者主页。

插件 能力方向 插件市场
lizhao-app-keepalive 应用保活、唤醒、自愈与报告 查看插件
lizhao-bg-audio 背景音频播放、队列、倍速与事件 查看插件
lizhao-ble BLE 扫描、连接、读写、通知与自动重连 查看插件
lizhao-call-kit 电话、短信、通讯录原生能力 查看插件
lizhao-camera-pro 原生相机、拍照录像、水印与媒体保存 查看插件
lizhao-cast-screen DLNA 投屏、AirPlay 路由入口 查看插件
lizhao-choose-file 原生文件选择、上传、进度与取消 查看插件
lizhao-device-id 设备标识、隐私策略与诊断 查看插件
lizhao-doc-corrector 文档扫描、矫正、增强与识别 查看插件
lizhao-emu-detect 模拟器环境检测、风险评分与证据 查看插件
lizhao-float-window 悬浮窗、画中画、权限与诊断 查看插件
lizhao-gallery-pro 相册媒体分页、筛选、缩略图与导出 查看插件
lizhao-hce-card NFC 虚拟卡、APDU 交互与 NDEF 标签模拟 查看插件
lizhao-health 健康数据授权、查询、统计与写入 查看插件
lizhao-http-server 本地 HTTP 服务、文件传输与实时通信 查看插件
lizhao-icon-pro SVG 图标组件、多主题与缓存 查看插件
lizhao-id-photo 证件照制作、尺寸换算、换底色与模板换装 查看插件
lizhao-img-eraser 图片去水印、局部修复与原生编辑器 查看插件
lizhao-live-activity 实时活动、系统胶囊与普通通知降级 查看插件
lizhao-nfc-pro NFC 标签读写、NDEF、IsoDep 与诊断 查看插件
lizhao-notify-pro 本地通知、点击动作、进度与定时提醒 查看插件
lizhao-novel-reader 原生小说阅读、仿真翻页与段落评论 查看插件
lizhao-office-view Office 与 PDF 文件预览、进度与缓存管理 查看插件
lizhao-pdf-pro PDF 阅读、签批、真实写回与页面处理 查看插件
lizhao-scan-pro 原生扫码、连续扫码、相册识别 查看插件
lizhao-serial-port 路径串口、USB 串口、多会话收发与诊断 查看插件
lizhao-share-plus 系统分享、远程文件下载后分享 查看插件
lizhao-smart-tts 系统 TTS、云端合成、听书方案 查看插件
lizhao-sqlite-pro 原生 SQLite、迁移、备份与诊断 查看插件
lizhao-sse-pro SSE、Line、JSONL 与 Raw 流式请求 查看插件
lizhao-tcp-pro TCP 客户端、服务端、多连接与诊断 查看插件
lizhao-usb-storage U 盘、移动硬盘文件浏览、读写与批量复制 查看插件
lizhao-video-editor 视频裁剪、压缩、取帧与 FFmpeg/FFprobe 查看插件
lizhao-video-feed 短视频上下滑、短剧选集与分页加载 查看插件
lizhao-video-player 原生视频播放器、清晰度与播放交互 查看插件
lizhao-video-thumb 视频封面、批量取帧与 Base64 返回 查看插件
lizhao-vpn-pro 企业 VPN、IKEv2、安全接入与脱敏诊断 查看插件
lizhao-wechat-kit 微信登录、分享、支付、小程序与客服 查看插件

隐私、权限声明

1. 本插件需要申请的系统权限列表:

Android: NFC 权限;iOS: NFCReaderUsageDescription 与 NFC Capability;HarmonyOS: ohos.permission.NFC_TAG

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

读取或写入用户主动靠近设备的 NFC 标签数据;不会后台静默读取标签

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无