更新记录

1.2.0(2026-01-30)

新增 HarmonyOS 平台支持

1.0.0(2026-01-30)

  • 新增 Android
  • 新增 UTS API:
    • onTagDiscovered:前台碰卡持续回调
    • getPendingTagSync:读取后台缓存事件(可读取后清空)
    • clearPendingTag:清空缓存
    • isNfcSupported / isNfcEnabled:能力与开关判断
  • 支持识别技术类型:NDEF、Mifare Classic/Ultralight、IsoDep、NfcA/B/F/V

平台兼容性

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.0.0 12 1.0.0 12 1.0.0
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 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 等)

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 读块 ✅ 支持 ❌ 不支持 ✅ 支持
最低系统版本 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) 全平台 配置插件参数
mifareClassicReadSector(...) Android/HarmonyOS 读取 MiFare Classic 扇区
mifareClassicReadBlock(...) Android/HarmonyOS 读取 MiFare Classic 块
mifareUltralightReadPages(...) Android/HarmonyOS 读取 MiFare Ultralight 页
isoDepTransceive(apduHex) Android/HarmonyOS IsoDep 发送 APDU 命令
ndefWrite(records) HarmonyOS 写入 NDEF 消息
mifareClassicWriteBlock(...) HarmonyOS 写入 MiFare Classic 块
mifareUltralightWritePage(...) HarmonyOS 写入 MiFare Ultralight 页

写入操作示例(HarmonyOS)

1) 写入 NDEF 消息

import { ndefWrite, startNFCSession, onTagDiscovered } from '@/uni_modules/hl-nfccase-uts'

// 先扫描标签
onTagDiscovered((event) => {
  console.log('标签已扫描:', event.uidHex)

  // 写入 NDEF 数据
  const res = ndefWrite([
    { type: 'text', data: 'Hello NFC' },
    { type: 'uri', data: 'https://example.com' }
  ])

  if (res.code === 0) {
    console.log('NDEF 写入成功')
  } else {
    console.error('写入失败:', res.data.error)
  }
})

startNFCSession()

2) 写入 MiFare Classic 块

import { mifareClassicWriteBlock } from '@/uni_modules/hl-nfccase-uts'

// 写入块 4(需要密钥认证)
const res = mifareClassicWriteBlock(
  4,                    // 块号
  'A',                  // 密钥类型
  'FFFFFFFFFFFF',       // 6字节密钥
  '00112233445566778899AABBCCDDEEFF'  // 16字节数据
)

if (res.code === 0) {
  console.log('写入成功')
}

3) 写入 MiFare Ultralight 页

import { mifareUltralightWritePage } from '@/uni_modules/hl-nfccase-uts'

// 写入页 4
const res = mifareUltralightWritePage(
  4,          // 页号
  '00112233'  // 4字节数据
)

if (res.code === 0) {
  console.log('写入成功')
}

返回数据结构

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. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。