更新记录

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环境兼容性

uni-app uni-app x

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 包含 NDEFTAG
  • 系统要求: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 }
  }
}

隐私、权限声明

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

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

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

仅读取 NFC 标签数据,不收集用户信息

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