更新记录

1.0.0(2025-09-01)

** 尽可能更新到最新版本 第一版 支持 isoDep,NfcA ,NfcB,NfcF,NfcV,Ndef,MifareClassic,MifareUltralight,等多种协议 遇到什么问题随时联系作者


平台兼容性

uni-app(4.76)

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

uni-app x(4.76)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - - - - -

其他

多语言 暗黑模式 宽屏模式

** uniapp Hbuilderx 尽可能更新到最新版本 低版本不确定是否兼容

第一步 引入插件: import * as nfcPlugin from '@/uni_modules/nfc-plugin'

第二步 创建实例 var NFC = new nfcPlugin.HarmonyNFCAdapter()

// 初始化HEC NFC.initHCE(aidList : string[]) : Promise;

// 启动标签发现 成功返回 taginfo 标签信息(获取标签对象时需传入此参数) 失败返回false NFC.onDiscovered() : Promise<tag.TagInfo | boolean>

//关闭标签发现 成功返回1失败 返回0 NFC.offDiscovered() : Promise


IsoDep 协议

const IsoDep = getIsoDep(tagInfo) // 用于支持 ISO-DEP协议 (基于ISO 14443-4标准)的智能卡 成功返回标签对象 失败返回 null IsoDep.connect(): void // 建立与 ISO-DEP标签的连接 IsoDep.getHiLayerResponse(): number[] IsoDep.getHistoricalBytes(): number[] IsoDep.getMaxTransmitSize(): number IsoDep.isExtendedApduSupported(): Promise (+1 overload) IsoDep.isConnected(): boolean // 检查是否已与标签建立连接 IsoDep.getTimeout(): number // 获取当前ISO-DEP操作的超时时间(毫秒) IsoDep.setTimeout() //设置NFC-A操作的超时时间 IsoDep.resetConnection(): void // 重置与标签的连接状态 重新调用connect()方法才能恢复通信 IsoDep.transmit(data: number[]): Promise<number[]> (+1 overload) // 向 IsoDep标签发送指令并接收响应 number[]>字节数组


NfcA 协议

const NfcA = getNfcA(tagInfo) // 用于支持 NFC-A协议 (ISO 14443 Type A)的标签 成功返回标签对象 失败返回 null NfcA.connect(): void // 建立与标签的连接 NfcA.NfcATag.getAtqa(): number[] // 获取NFC-A标签的ATQA(Answer To Request A)响应值 ATQA对请求命令的响应数据 NfcA.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) NfcA.getSak(): number // 获取NFC-A标签的SAK值 SAK是标签在被选中后返回的值,包含标签的额外属性信息 NfcA.getTimeout(): number // 获取当前NFC-A操作的超时时间(毫秒) NfcA.isConnected(): boolean // 检查是否已与NFC-A标签建立连接 NfcA.resetConnection(): void // 重置与NFC-A标签的连接状态 重新调用connect()方法才能恢复通信 NfcA.setTimeout() //设置NFC-A操作的超时时间 NfcA.transmit(data: number[]): Promise<number[]> (+1 overload) // 向标签发送原始数据并接收响应 number[]>字节数组


NfcB 协议

const NfcB = getNfcB(tagInfo) // 用于支持 NFC-B协议 (ISO 14443 Type B)的标签 成功返回标签对象 失败返回 null NfcB.connect(): void // 建立与标签的连接 NfcB.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) NfcB.getRespAppData(): number[] // 获取NFC-B标签的应用数据响应 返回number[] 字节数组 NfcB.getRespProtocol(): number[] // 获取NFC-B标签的协议响应 返回number[] 字节数组 NfcB.getTimeout(): number // 获取当前NFC-B操作的超时时间(毫秒) NfcB.isConnected(): boolean // 检查是否已与标签建立连接 NfcB.resetConnection(): void // 重置与标签的连接状态 NfcB.setTimeout(timeout: number): void // 获取当前NFC操作的超时时间(毫秒) NfcB.transmit(data: number[]): Promise<number[]> (+1 overload) // 向 NFC-B标签发送原始数据并接收响应 number[]>字节数组


NfcF协议

const getNfcF(tagInfo) // 用于支持 NFC-F协议 (JIS X 6319-4)的标签,主要用于日本的FeliCa卡。 成功返回标签对象 失败返回 null NfcF.connect(): void // 建立与标签的连接 NfcF.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) NfcF.getPmm(): number[] // 获取NFC-F标签的PMm number[]>包含PMm值的字节数组 NfcF.getSystemCode(): number[] // 获取NFC-F标签的系统代码() NFC-F协议中用于标识特定应用或服务的唯一标识 NfcF.getTimeout(): number // 获取当前NFC操作的超时时间(毫秒) NfcF.isConnected(): boolean // 检查是否已与标签建立连接 NfcF.NfcB.resetConnection(): void // 重置与标签的连接状态 NfcF.setTimeout(timeout: number): void // 设置NFC操作的超时时间(毫秒) NfcF.transmit(data: number[]): Promise<number[]> (+1 overload) // 向标签发送原始数据并接收响应 number[]>字节数组


NfcV协议

const getNfcV(tagInfo) // 用于支持 NFC-V协议 (ISO 15693)的标签,通常是非接触式IC卡。 成功返回标签对象 失败返回 null

NfcV.connect(): void // 建立与标签的连接 NfcV.getDsfId(): number // 获取NFC-V标签的DSF ID 用于标识标签的数据存储格式和组织方式 NfcV.getResponseFlags(): number // 获取NFC-V标签的响应标志位 报含标签对命令的响应状态信息,如是否成功执行命令等 NfcV.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) NfcV.getTimeout(): number // 获取当前NFC操作的超时时间(毫秒) NfcV.isConnected(): boolean // 检查是否已与标签建立连接 NfcV.NfcB.resetConnection(): void // 重置与标签的连接状态 NfcV.setTimeout(timeout: number): void // 设置NFC操作的超时时间(毫秒) NfcV.transmit(data: number[]): Promise<number[]> (+1 overload) // 向 NFC-V标签发送原始数据并接收响应 number[]>字节数组


Ndef 协议

const Ndef = getNdef(tagInfo) 获取Ndef 标签对象 成功返回标签对象 失败返回 null

Ndef.connect(): void // 建立与NDEF标签的连接 Ndef.canSetReadOnly(): boolean // 检查NDEF标签是否支持设置为只读状态 Ndef.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) Ndef.getNdefMessage(): NdefMessage //获取标签中当前存储的NDEF消息 Ndef.getNdefTagType(): tag.NfcForumType // 获取NDEF标签的类型 Ndef.getNdefTagTypeString(type: tag.NfcForumType): string // 将NDEF标签类型枚举转换为可读的字符串表示 Ndef.getTimeout(): number // 获取当前NFC操作的超时时间(毫秒) Ndef.setTimeout(timeout: number): void // 设置NFC操作的超时时间 Ndef.isConnected(): boolean // 检查是否已与标签建立连接 Ndef.isNdefWritable(): boolean //检查NDEF标签是否可写入 Ndef.readNdef(): Promise (+1 overload) // 从NDEF标签读取NDEF消息 Ndef.resetConnection(): void // 重置与NDEF标签的连接状态 Ndef.setReadOnly(): Promise (+1 overload) // 将NDEF标签设置为只读状态 此操作通常不可逆 设置后标签将无法再写入数据 Ndef.transmit(data: number[]): Promise<number[]> (+1 overload) //向NDEF标签发送原始数据并接收响应 自定义命令交互 Ndef.NdefTag.writeNdef(msg: NdefMessage): Promise (+1 overload) // 向NDEF标签写入NDEF消息


MifareClassic 协议 const MifareClassic = getMifareClassic(tagInfo) 专用于 M1卡 (MIFARE Classic系列卡,如S50/S70卡)的操作

MifareClassic.connect(): void // 建立与标签的连接

  • 验证MIFARE Classic标签的指定扇区

  • @param sectorIndex - 要验证的扇区索引

  • @param key - 验证密钥(字节数组形式)

  • @param isKeyA - 是否使用KeyA进行验证 MifareClassic.authenticateSector(sectorIndex: number, key: number[], isKeyA: boolean): Promise (+1 overload)

  • 减少MIFARE Classic标签指定块中的值

  • @param blockIndex - 要操作的块索引

  • @param value - 要减少的值 MifareClassic.decrementBlock(blockIndex: number, value: number): Promise (+1 overload)

  • 获取MIFARE Classic标签指定扇区中的块数量

  • @param sectorIndex - 扇区 MifareClassic.getBlockCountInSector(sectorIndex: number): number

  • 获取MIFARE Classic标签指定扇区的起始块索引

  • @param sectorIndex - 扇区索引

  • @returns number - 该扇区第一个块的索引 MifareClassic.getBlockIndex(sectorIndex: number): number

MifareClassic.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) MifareClassic.getSectorCount(): number // 获取MIFARE Classic标签的总扇区数量

  • 根据块索引获取对应的扇区索引

  • @param blockIndex - 块索引

  • @returns number - 该块所属的扇区索引 MifareClassic.getSectorIndex(blockIndex: number): number

  • 获取MIFARE Classic标签的总容量(字节)

  • @returns number - 标签的总容量 MifareClassic.getTagSize(): number //

MifareClassic.getTimeout(): number // 获取当前NFC操作的超时时间(毫秒)

  • 获取MIFARE Classic标签的具体类型
  • @returns tag.MifareClassicType - 标签类型枚举值(如S50、S70等) MifareClassic.getType(): tag.MifareClassicType
  • 增加MIFARE Classic标签指定块中的值
    • 通常用于电子钱包功能,增加钱包余额
    • @param blockIndex - 要操作的块索引
    • @param value - 要增加的值
    • @returns Promise - 操作完成的Promise MifareClassic.incrementBlock(blockIndex: number, value: number): Promise (+1 overload)

MifareClassic.isConnected(): boolean // 检查是否已与标签建立连接

  • 检查当前MIFARE Classic标签是否为模拟标签

    • @returns boolean - 如果是模拟标签返回true,否则返回false MifareClassic.isEmulatedTag(): boolean

    • 读取MIFARE Classic标签指定块的数据

    • @param blockIndex - 要读取的块索引

    • @returns Promise<number[]> - 包含块数据的字节数组Promise MifareClassic.readSingleBlock(blockIndex: number): Promise<number[]> (+1 overload)

MifareClassic.resetConnection(): void // 重置与MIFARE Classic标签的连接状态

从MIFARE Classic标签的指定块恢复之前减少或增加的值

  • 通常与decrementBlock/incrementBlock配合使用,用于电子钱包回滚操作
  • @param blockIndex - 要恢复的块索引
  • @returns Promise - 恢复操作完成的Promise MifareClassic.restoreFromBlock(blockIndex: number): Promise (+1 overload)

MifareClassic.setTimeout(timeout: number): void // 设置NFC操作的超时时间

  • 将之前通过incrementBlock或decrementBlock修改的值传输到MIFARE Classic标签的指定块

    • 通常与incrementBlock/decrementBlock配合使用,用于电子钱包确认操作
    • @param blockIndex - 要传输到的块索引
    • @returns Promise - 传输操作完成的Promise MifareClassic.transferToBlock(blockIndex: number): Promise (+1 overload)
  • 向MIFARE Classic标签的指定块写入数据

    • 写入前需要先对块所在扇区进行验证
    • @param blockIndex - 要写入的块索引
    • @param data - 要写入的字节数组数据(通常为16字节)
    • @returns Promise - 写入操作完成的Promise MifareClassic.writeSingleBlock(blockIndex: number, data: number[]): Promise (+1 overload)

MifareClassic.transmit(data: number[]): Promise<number[]> (+1 overload) //向标签发送数据并接收响应 自定义命令交互


MIFARE Ultralight 协议

const MifareUltralight = getMifareUltralight(tagInfo) // 用于 MIFARE Ultralight卡(一种轻量级的MIFARE卡),非M1卡。 MifareUltralight.connect(): void // 建立与标签的连接 MifareUltralight.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) MifareUltralight.getTimeout(): number // 获取当前NFC操作的超时时间(毫秒)

  • 获取MIFARE Ultralight标签的具体类型
  • 用于识别当前操作的MIFARE Ultralight标签是哪种具体型号,如标准Ultralight、Ultralight C或其他衍生类型 MifareUltralight.getType(): tag.MifareUltralightType

MifareUltralight.MifareClassic.isConnected(): boolean // 检查是否已与标签建立连接

  • 从MIFARE Ultralight标签读取从指定页开始的多个连续页数据
  • 适用于需要批量读取标签数据的场景,可以一次性获取多页内容以提高读取效率
  • @param pageIndex - 起始页索引,表示从第几页开始 MifareUltralight.readMultiplePages(pageIndex: number): Promise<number[]> (+1 overload)

MifareUltralight.resetConnection(): void // 重置与标签的连接 setTimeout(timeout: number): void // 设置与MIFARE Ultralight标签交互的超时时间 MifareUltralight.setTimeout(timeout: number): void // 设置NFC操作的超时时间 MifareUltralight.transmit(data: number[]): Promise<number[]> (+1 overload) //向标签发送指令并接收响应 自定义命令交互 number[]> 字节数组

  • 向MIFARE Ultralight标签的指定页写入数据(必须先建立连接)
  • 用于修改标签的特定页内容,适用于需要更新标签数据的场景
  • @param pageIndex - 目标页索引,表示要写入数据的页面编号
  • @param data - 要写入的数据字节数组,通常需要包含4字节数据(对应一页容量) MifareUltralight.writeSinglePage(pageIndex: number, data: number[]): Promise (+1 overload)

NdefFormatable 协议

const NdefFormatable = getNdefFormatable(tagInfo) // 用于可格式化为NDEF(NFC数据交换格式)的标签,与卡类型无直接对应关系

NdefFormatable.connect(): void // 建立与标签的连接

  • 将支持格式化的NFC标签格式化为NDEF格式,并写入初始NDEF消息
  • 用于将非NDEF格式的标签转换为标准NDEF格式标签,使其能够存储和传输NDEF数据
  • @param message - 要写入的NDEF消息对象,包含标签格式化后存储的初始数据 NdefFormatable.format(message: NdefMessage): Promise (+1 overload)
  • 将支持格式化的NFC标签格式化为只读NDEF格式,并写入初始NDEF消息
    • 用于创建一次性写入、永久可读的NDEF标签,适用于需要防止数据被篡改的场景
    • @param message - 要写入的NDEF消息对象,包含标签格式化后存储的唯一数据 NdefFormatable.formatReadOnly(message: NdefMessage): Promise (+1 overload

NdefFormatable.Ndef.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) NdefFormatable.getTimeout(): number // 获取当前NFC操作的超时时间(毫秒) NdefFormatable.setTimeout(timeout: number): void // 设置NFC操作的超时时间 NdefFormatable.isConnected(): boolean // 检查是否已与标签建立连接 NdefFormatable.resetConnection(): void // 重置与标签的连接 NdefFormatable.transmit(data: number[]): Promise<number[]> (+1 overload) //向标签发送指令并接收响应 自定义命令交互 number[]> 字节数组

隐私、权限声明

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

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

插件不采集任何数据

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

暂无用户评论。