更新记录

1.0.6(2026-09-07)

  • 新增 startContinuousTagScanning(),支持 Android、iOS、HarmonyOS 连续识别多张标签

1.0.5(2026-09-05)

  • 修复使用新版 iOS SDK 打包时因弃用的 NDEF entitlement 导致 App Store 上传校验失败的问题
  • HarmonyOS 端新增 MIFARE Classic 扇区读写实现,对齐 Android 和 iOS 的调用参数及回调数据

1.0.4(2026-03-25)

  • 鸿蒙端新增取消扫描
查看更多

平台兼容性

uni-app(4.81)

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

uni-app x(4.81)

Chrome Safari Android iOS iOS插件版本 鸿蒙 鸿蒙插件版本 微信小程序
× × 13 1.0.0 1.0.1 ×

yt-nfc

开发文档

特别提醒

  • 购买本插件前,请先试用,请先试用,请先试用,确认满足需求之后再行购买。虚拟物品一旦购买之后无法退款。
  • 如有使用上的疑问、bug,可以进交流群联系作者;
  • 请在合法范围内使用,若使用本插件做非法开发,本方概不负责;
  • 可扫描右侧二维码安装Android示例demo,体验插件功能
  • iOS使用示例demo测试时,要先修改manifest中项目名称后再打包(名称长度尽量短一点),不然会因为名称过长,导致App启动不了。
  • iOS 端需要在 Apple Developer 的 Certificates, Identifiers & Profiles / Identifiers 中勾选 NFC Tag Reading,然后重新生成并使用描述文件打包。新版 iOS SDK 的 com.apple.developer.nfc.readersession.formats 仅配置 TAG,不要再添加已弃用的 NDEF
  • iOS 的 readMifareClassicwriteMifareClassic 调用入口会继续保留,确保已接入项目无需修改代码;但 Apple Core NFC 的原生 MIFARE 命令不支持 Crypto1,而标准 MIFARE Classic 的 Key A/Key B 扇区认证依赖 Crypto1,因此 iPhone 无法保证完成真正的 MIFARE Classic 扇区读写。Apple 官方说明:sendMiFareCommand(commandPacket:completionHandler:)。Android、HarmonyOS 仍按原接口支持 MIFARE Classic。

插件主要功能

  • NFC检测(iOS、Android、HarmonyOS)
  • NDEF数据读取(iOS、Android、HarmonyOS)
  • 连续扫描在三个平台都只支持应用前台使用。iOS Core NFC 的单次读取会话受系统限制,会在约 60 秒后结束;收到会话结束或错误回调后,如需继续扫描,请由业务再次调用 startContinuousTagScanning()。Apple 官方说明:Introducing Core NFCrestartPolling()
  • NDEF数据写入(iOS、Android、HarmonyOS)
  • MIFARE Classic 扇区数据写入(Android、HarmonyOS;iOS 保留兼容调用入口,能力限制见上方说明)
  • MIFARE Classic 扇区数据读取(Android、HarmonyOS;iOS 保留兼容调用入口,能力限制见上方说明)
  • 支持iOS、Android、HarmonyOS

更多好用实惠插件

插件接入

1.点击插件首页”试用“,选择项目导入插件,导入后可在项目根目录下uni_modules文件中查看是否有yt-nfc文件夹,有则导入成功。

引入插件--注意需引用插件后再打自定义基座调试

在需要使用的页面引入插件

import *as NFCManager from '../../uni_modules/yt-nfc'

注册监听回调

注册监听回调,建议在onLoad()中监听:NFCManager.registrationCallback(callBack: (res) => {})

  • uniapp注册监听回调
//完整代码
onLoad() {
            NFCManager.registrationCallback({
                callBack: (res) => {
                    console.log(res)
                    let functionName = `${res["functionName"]}`;
                    let msg = `${res["msg"]}`;
                    switch (functionName) {
                        case "onNDEFReadSuccess": //读取ndef数据成功回调
                        {
                            let ndefRecords = res["ndefRecords"];
                            if (ndefRecords.length > 0) {
                                let ndefRecord = ndefRecords[0];
                                let typeNameFormat = ndefRecord["typeNameFormat"]
                                let type = ndefRecord["type"]
                                let typeHex = ndefRecord["typeHex"]
                                let identifier = ndefRecord["identifier"]
                                let payloadHex = ndefRecord["payloadHex"]
                                let content = ndefRecord["content"]
                                let payloadType = ndefRecord["payloadType"]
                                console.log(
                                    `读取ndef数据成功--typeNameFormat:${typeNameFormat}  type:${type}  typeHex:${typeHex}  identifier:${identifier}  payloadHex:${payloadHex}  content:${content}  payloadType:${payloadType}`
                                )
                            }
                        }
                        break;
                        case "onNDEFWriteSuccess": //ndef数据写入成功回调
                        {
                            console.log(msg);
                        }
                        break;
                        case "onMifareReadSuccess": //扇区数据读取成功
                        {
                            let sector = res["mifareClassicInfo"]["sector"];
                            let block = res["mifareClassicInfo"]["block"];
                            let data = res["mifareClassicInfo"]["data"];
                            console.log(`扇区数据读取成功--扇区:${sector}  块:${block}  数据:${data}`);
                        }

                        break;
                        case "onMifareWriteSuccess": //扇区数据写入成功
                        {
                            let sector = res["mifareClassicInfo"]["sector"];
                            let block = res["mifareClassicInfo"]["block"];
                            console.log(`扇区数据写入成功--扇区:${sector}  块:${block}`);
                        }
                        break;
                        case "onTagDetected": //标签检测回调
                        {
                            let idString = res["discoveryInfo"]["identifierHex"];
                            let technologys = res["discoveryInfo"]["technology"];
                            console.log(`检测到标签--唯一标识:${idString}  标签类型:${technologys}`)
                        }
                        break;
                        case "onError": //错误回调
                        {
                            console.log(msg);
                        }
                        break;
                        default:
                            break;
                    }
                }
            })
        },
  • uniapp-x项目监听回调
onLoad() {
            NFCManager.registrationCallback({
                callBack: (res) => {
                    let result = res as NFCManager.RegistrationOptionInfo;
                    let functionName = result.functionName;
                    let msg = result.msg;
                    switch (functionName) {
                        case "onNDEFReadSuccess"://读取ndef数据成功回调
                            {
                                if (result.ndefRecords == null) {
                                    return;
                                }
                                let ndefRecords = result.ndefRecords!;
                                if (ndefRecords.length > 0) {
                                    let ndefRecord : NFCManager.ReadNdefRecordInfo = ndefRecords[0];
                                    let typeNameFormat = ndefRecord.typeNameFormat;
                                    let type = ndefRecord.type
                                    let typeHex = ndefRecord.typeHex
                                    let identifier = ndefRecord.identifierHex
                                    let payloadHex = ndefRecord.payloadHex
                                    let content = ndefRecord.content
                                    let payloadType = ndefRecord.payloadType
                                    console.log(`读取ndef数据成功--typeNameFormat:${typeNameFormat}  type:${type}  typeHex:${typeHex}  identifier:${identifier}  payloadHex:${payloadHex}  content:${content}  payloadType:${payloadType}`)
                                }
                            }
                            break;
                        case "onNDEFWriteSuccess"://ndef数据写入成功回调
                            {
                                console.log(msg);
                            }
                            break;
                        case "onMifareReadSuccess"://扇区数据读取成功
                            {
                                if (result.mifareClassicInfo == null) {
                                    return
                                }
                                let sector = result.mifareClassicInfo!.sector;
                                let block = result.mifareClassicInfo!.block;
                                let data = result.mifareClassicInfo!.data;
                                console.log(`扇区数据读取成功--扇区:${sector}  块:${block}  数据:${data}`);
                            }

                            break;
                        case "onMifareWriteSuccess"://扇区数据写入成功
                            {
                                if (result.mifareClassicInfo == null) {
                                    return
                                }
                                let sector = result.mifareClassicInfo!.sector;
                                let block = result.mifareClassicInfo!.block;
                                console.log(`扇区数据写入成功--扇区:${sector}  块:${block}`);
                            }
                            break;
                        case "onTagDetected"://标签检测回调
                            {
                                if (result.discoveryInfo == null) {
                                    return;
                                }
                                let idString = result.discoveryInfo!.identifierHex;
                                let tagType = result.discoveryInfo!.technology;
                                console.log(`检测到标签--唯一标识:${idString}  标签类型:${tagType}`)
                            }
                            break;
                        case "onError"://错误回调
                            {
                                console.log(msg);
                            }
                            break;
                        default:
                            break;
                    }
                }
            } as NFCManager.RegistrationOption);
        },

单独检测

单独检测/扫描返回NFC类型和系列号(唯一标识)

NFCManager.startNFCDiscoverySession();

NDEF读取

读取标签NDEF数据读取成功会触发NFCManager.registrationCallback/case "onNDEFReadSuccess"://读取ndef数据成功回调

NFCManager.startTagScanning()

连续扫描

startContinuousTagScanning() 用于连续识别多张标签。调用一次后,每次更换标签都会继续通过已经注册的 registrationCallback 返回原有事件,直到调用 stopScan(),或者系统结束当前 NFC 会话。

NFCManager.registrationCallback({
    callBack: (res) => {
        // 沿用原有 functionName 和数据结构:
        // onTagDetected、onNDEFReadSuccess、onError 等
        console.log(res)
    }
})

NFCManager.startContinuousTagScanning()

// 不再需要识别时主动停止
NFCManager.stopScan()

连续模式规则:

  • 默认操作是读取每张标签的 NDEF,并重复返回原有 onTagDetectedonNDEFReadSuccessonError 回调。
  • 请先移开当前标签,再贴近下一张标签;同一张标签持续停留在感应区时,系统不会把它当成新标签反复处理。
  • 连续扫描期间调用原有 startNFCDiscoverySession()startNFCScan()startTagScanning()writeNDEF()readMifareClassic()writeMifareClassic(),只会改变下一张标签要执行的一次操作;完成后会自动恢复默认 NDEF 连续读取,不会关闭连续扫描。
  • 写入始终是一次性操作,不会把同一份数据连续写入后续标签。
  • stopScan() 会结束连续扫描并清除尚未执行的临时读写任务。再次扫描需重新调用 startContinuousTagScanning()
  • Android 和 HarmonyOS 在应用保持前台且系统未中断 NFC 的情况下可以持续扫描。iOS 的单次 Core NFC 会话会在约 60 秒后因系统限制结束,插件会沿用现有 onError/会话结束流程返回;需要继续时重新调用 startContinuousTagScanning()

iOS 官方资料:Core NFC 会话时限说明(WWDC 2017)NFCTagReaderSession.restartPolling()

NDEF数据写入

写入成功会触发NFCManager.registrationCallback/case "onNDEFWriteSuccess"://ndef数据写入成功回调

  • uniappNDEF写入示例
let list = [{
    contentType: "URL",
    content: "https://ext.dcloud.net.cn/",
    tagFormat: "NFC_WELL_KNOWN",
    identifier: ""
},
{
    contentType: "TEXT",
    content: "9999999999999999999999",
    tagFormat: "NFC_WELL_KNOWN",
    identifier: "00117712"
}];
NFCManager.writeNDEF(list)
  • uniapp-xNDEF写入示例
//uniapp 去掉as NFCManager.WriteNDEFOption类型转换,uniapp-x项目保留
writeNDEF() {
                let list : Array<NFCManager.WriteNDEFOption> = new Array();
                let v1 : NFCManager.WriteNDEFOption = {
                    contentType: "URL",
                    content: "https://ext.dcloud.net.cn/",
                    tagFormat: "NFC_WELL_KNOWN",
                    identifier: ""
                };
                let v2 : NFCManager.WriteNDEFOption = {
                    contentType: "TEXT",
                    content: "9999999999999999999999",
                    tagFormat: "NFC_WELL_KNOWN",
                    identifier: "00117712"
                };
                list.push(v1);
                list.push(v2);
                NFCManager.writeNDEF(list)
            }

NDEF写入参数说明:

参数 参数类型 说明
contentType string 内容类型,支持以下类型:TEXT: 普通文本内容、URL: 网页地址、SMS: 短信内容,格式:"电话号码,短信内容" 或 "电话号码"、EMAIL: 邮件内容,格式:"邮箱地址" 或 "邮箱地址,主题" 或 "邮箱地址,主题,正文"、TELEPHONE: 电话号码、CUSTOM_SCHEME: 自定义 URL Scheme
content string 要写入的内容,根据 contentType 有不同的格式要求
tagFormat string 标签格式,默认为 NFC_WELL_KNOWN,支持以下格式:NFC_WELL_KNOWN: 使用标准的 NDEF Well Known 格式、MEDIA: 使用 MIME 媒体类型格式、ABSOLUTE_URI: 使用绝对 URI 格式、NFC_EXTERNAL: 使用 NFC 外部类型格式
identifier string 唯一标识符,用于标识该 NDEF 记录(可选)

扇区数据读取

读取扇区数据,成功会触发NFCManager.registrationCallback/case "onMifareReadSuccess"://扇区数据读取成功

//uniapp 去掉as NFCManager.MifareOption类型转换,uniapp-x项目保留
NFCManager.readMifareClassic({
    sector: 0,
    block: 0,
    key: "FF:FF:FF:FF:FF:FF",
    keyType: "A"
} as NFCManager.MifareOption)

扇区数据读取参数说明:

参数 参数类型 说明
sector number 扇区号 取值范围0~15
block number 块索引 取值范围0~3
key string 密钥字符串,支持 "0B:XX:XX" 或 "0BXX" 格式,默认"FF:FF:FF:FF:FF:FF"
keyType string 密钥类型字符串,支持 "A" 或 "B" 默认A

扇区数据写入

写入扇区数据,成功会触发NFCManager.registrationCallback/case "onMifareWriteSuccess"://扇区数据写入成功

//uniapp 去掉as NFCManager.MifareOption类型转换,uniapp-x项目保留
NFCManager.writeMifareClassic({
sector: 0,
block: 0,
key: "FF:FF:FF:FF:FF:FF",
 keyType: "A",
 data: "123456789"
} as NFCManager.MifareOption)

扇区数据写入参数说明:

参数 参数类型 说明
sector number 扇区号 取值范围0~15
block number 块索引 取值范围0~2,3为扇区控制块,不允许写入
key string 密钥字符串,支持 "0B:XX:XX" 或 "0BXX" 格式,默认"FF:FF:FF:FF:FF:FF"
keyType string 密钥类型字符串,支持 "A" 或 "B" 默认A
data string 写入数据,支持十六进制字符串、数字字符串或普通UTF-8文本,最多16字节,不足16字节时自动补0

设备是否支持NFC

let isEnable = NFCManager.isNfcAvailable();
console.log(isEnable ? "NFC可用" : "NFC不可用");

停止扫描/读取/写入

NFCManager.stopScan();

uniapp完整示例

<template>
    <view style="display: flex;flex-direction: column;align-items: center;">
        <image class="logo" src="/static/logo.png" @click="startNFCScan"></image>
        <text class="title" @click="onceDiscoverySession">单独扫描</text>
        <text class="title" @click="startTagScanning">NDEF读取</text>
        <text class="title" @click="writeNDEF">NDEF写入</text>
        <text class="title" @click="readMifareClassic">扇区读取</text>
        <text class="title" @click="writeMifareClassic">扇区写入</text>
        <text class="title" @click="isNfcAvailable">是否支持NCF</text>
    </view>
</template>

<script>
    import * as NFCManager from '@/uni_modules/yt-nfc'
    export default {
        data() {
            return {
                title: 'Hello'
            }
        },
        onLoad() {
            NFCManager.registrationCallback({
                callBack: (res) => {
                    console.log(res)
                    let functionName = `${res["functionName"]}`;
                    let msg = `${res["msg"]}`;
                    switch (functionName) {
                        case "onNDEFReadSuccess": //读取ndef数据成功回调
                        {
                            let ndefRecords = res["ndefRecords"];
                            if (ndefRecords.length > 0) {
                                let ndefRecord = ndefRecords[0];
                                let typeNameFormat = ndefRecord["typeNameFormat"]
                                let type = ndefRecord["type"]
                                let typeHex = ndefRecord["typeHex"]
                                let identifier = ndefRecord["identifier"]
                                let payloadHex = ndefRecord["payloadHex"]
                                let content = ndefRecord["content"]
                                let payloadType = ndefRecord["payloadType"]
                                console.log(
                                    `读取ndef数据成功--typeNameFormat:${typeNameFormat}  type:${type}  typeHex:${typeHex}  identifier:${identifier}  payloadHex:${payloadHex}  content:${content}  payloadType:${payloadType}`
                                )
                            }
                        }
                        break;
                        case "onNDEFWriteSuccess": //ndef数据写入成功回调
                        {
                            console.log(msg);
                        }
                        break;
                        case "onMifareReadSuccess": //扇区数据读取成功
                        {
                            let sector = res["mifareClassicInfo"]["sector"];
                            let block = res["mifareClassicInfo"]["block"];
                            let data = res["mifareClassicInfo"]["data"];
                            console.log(`扇区数据读取成功--扇区:${sector}  块:${block}  数据:${data}`);
                        }

                        break;
                        case "onMifareWriteSuccess": //扇区数据写入成功
                        {
                            let sector = res["mifareClassicInfo"]["sector"];
                            let block = res["mifareClassicInfo"]["block"];
                            console.log(`扇区数据写入成功--扇区:${sector}  块:${block}`);
                        }
                        break;
                        case "onTagDetected": //标签检测回调
                        {
                            let idString = res["discoveryInfo"]["identifierHex"];
                            let technologys = res["discoveryInfo"]["technology"];
                            console.log(`检测到标签--唯一标识:${idString}  标签类型:${technologys}`)
                        }
                        break;
                        case "onError": //错误回调
                        {
                            console.log(msg);
                        }
                        break;
                        default:
                            break;
                    }
                }
            })
        },
        methods: {
            startNFCScan() {
                NFCManager.startNFCScan()

            },
            onceDiscoverySession() {
                NFCManager.startNFCDiscoverySession();
            },
            startTagScanning() {
                NFCManager.startTagScanning()
            },
            writeNDEF() {
                let list = [{
                        contentType: "URL",
                        content: "https://ext.dcloud.net.cn/",
                        tagFormat: "NFC_WELL_KNOWN",
                        identifier: ""
                    },
                    {
                        contentType: "TEXT",
                        content: "9999999999999999999999",
                        tagFormat: "NFC_WELL_KNOWN",
                        identifier: "00117712"
                    }
                ];
                NFCManager.writeNDEF(list)
            },
            readMifareClassic() {
                NFCManager.readMifareClassic({
                    sector: 0,
                    block: 0,
                    key: "FF:FF:FF:FF:FF:FF",
                    keyType: "A"
                })
            },
            writeMifareClassic() {
                NFCManager.writeMifareClassic({
                    sector: 0,
                    block: 0,
                    key: "FF:FF:FF:FF:FF:FF",
                    keyType: "A",
                    data: "123456789"
                })
            },
            isNfcAvailable() {
                NFCManager.isNfcAvailable();
            }
        }
    }
</script>

<style>
    .content {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
    }

    .logo {
        height: 200rpx;
        width: 200rpx;
        margin-top: 200rpx;
        margin-left: auto;
        margin-right: auto;
        margin-bottom: 50rpx;
    }

    .text-area {
        display: flex;
        justify-content: center;
    }

    .title {
        font-size: 36rpx;
        color: #8f8f94;
        margin-top: 30rpx;
    }
</style>

uniapp-x完整示例

<template>
    <view>
        <image class="logo" src="/static/logo.png" @click="startNFCScan"></image>
        <text class="title" @click="onceDiscoverySession">单独扫描</text>
        <text class="title" @click="startTagScanning">NDEF读取</text>
        <text class="title" @click="writeNDEF">NDEF写入</text>
        <text class="title" @click="readMifareClassic">扇区读取</text>
        <text class="title" @click="writeMifareClassic">扇区写入</text>
        <text class="title" @click="isNfcAvailable">是否支持NCF</text>
    </view>
</template>

<script>
    import *as NFCManager from '@/uni_modules/yt-nfc'
    export default {
        data() {
            return {
                title: 'Hello'
            }
        },
        onLoad() {
            NFCManager.registrationCallback({
                callBack: (res) => {
                    let result = res as NFCManager.RegistrationOptionInfo;
                    let functionName = result.functionName;
                    let msg = result.msg;
                    switch (functionName) {
                        case "onNDEFReadSuccess"://读取ndef数据成功回调
                            {
                                if (result.ndefRecords == null) {
                                    return;
                                }
                                let ndefRecords = result.ndefRecords!;
                                if (ndefRecords.length > 0) {
                                    let ndefRecord : NFCManager.ReadNdefRecordInfo = ndefRecords[0];
                                    let typeNameFormat = ndefRecord.typeNameFormat;
                                    let type = ndefRecord.type
                                    let typeHex = ndefRecord.typeHex
                                    let identifier = ndefRecord.identifierHex
                                    let payloadHex = ndefRecord.payloadHex
                                    let content = ndefRecord.content
                                    let payloadType = ndefRecord.payloadType
                                    console.log(`读取ndef数据成功--typeNameFormat:${typeNameFormat}  type:${type}  typeHex:${typeHex}  identifier:${identifier}  payloadHex:${payloadHex}  content:${content}  payloadType:${payloadType}`)
                                }
                            }
                            break;
                        case "onNDEFWriteSuccess"://ndef数据写入成功回调
                            {
                                console.log(msg);
                            }
                            break;
                        case "onMifareReadSuccess"://扇区数据读取成功
                            {
                                if (result.mifareClassicInfo == null) {
                                    return
                                }
                                let sector = result.mifareClassicInfo!.sector;
                                let block = result.mifareClassicInfo!.block;
                                let data = result.mifareClassicInfo!.data;
                                console.log(`扇区数据读取成功--扇区:${sector}  块:${block}  数据:${data}`);
                            }

                            break;
                        case "onMifareWriteSuccess"://扇区数据写入成功
                            {
                                if (result.mifareClassicInfo == null) {
                                    return
                                }
                                let sector = result.mifareClassicInfo!.sector;
                                let block = result.mifareClassicInfo!.block;
                                console.log(`扇区数据写入成功--扇区:${sector}  块:${block}`);
                            }
                            break;
                        case "onTagDetected"://标签检测回调
                            {
                                if (result.discoveryInfo == null) {
                                    return;
                                }
                                let idString = result.discoveryInfo!.identifierHex;
                                let tagType = result.discoveryInfo!.technology;
                                console.log(`检测到标签--唯一标识:${idString}  标签类型:${tagType}`)
                            }
                            break;
                        case "onError"://错误回调
                            {
                                console.log(msg);
                            }
                            break;
                        default:
                            break;
                    }
                }
            } as NFCManager.RegistrationOption);
        },
        methods: {
            //nfc读取
            startTagScanning() {
                NFCManager.startTagScanning()
            },
            startNFCScan() {
                NFCManager.startNFCScan()
            },
            //ndef数据写入
            writeNDEF() {
                let list : Array<NFCManager.WriteNDEFOption> = new Array();
                let v1 : NFCManager.WriteNDEFOption = {
                    contentType: "URL",
                    content: "https://ext.dcloud.net.cn/",
                    tagFormat: "NFC_WELL_KNOWN",
                    identifier: ""
                };
                let v2 : NFCManager.WriteNDEFOption = {
                    contentType: "TEXT",
                    content: "9999999999999999999999",
                    tagFormat: "NFC_WELL_KNOWN",
                    identifier: "00117712"
                };
                list.push(v1);
                list.push(v2);
                NFCManager.writeNDEF(list)
            },
            //扇区读取
            readMifareClassic() {
                NFCManager.readMifareClassic({
                    sector: 0,
                    block: 0,
                    key: "FF:FF:FF:FF:FF:FF",
                    keyType: "A"
                } as NFCManager.MifareOption)
            },
            //扇区写入
            writeMifareClassic() {
                NFCManager.writeMifareClassic({
                    sector: 0,
                    block: 0,
                    key: "FF:FF:FF:FF:FF:FF",
                    keyType: "A",
                    data: "123456789"
                } as NFCManager.MifareOption)
            },
            //单独检测(扫描)
            onceDiscoverySession() {
                NFCManager.startNFCDiscoverySession();
            },
            //是否支持NFC
            isNfcAvailable() {
                let isEnable = NFCManager.isNfcAvailable();
                console.log(isEnable ? "NFC可用" : "NFC不可用");
            }
        }
    }
</script>

<style>
    .logo {
        height: 100px;
        width: 100px;
        margin: 100px auto 25px auto;
    }

    .title {
        font-size: 18px;
        color: #8f8f94;
        text-align: center;
        margin-top: 30rpx;
    }
</style>

隐私、权限声明

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

Android:<!-- NFC 权限 --> <uses-permission android:name="android.permission.NFC" /> <!-- NFC 功能声明 --> <uses-feature android:name="android.hardware.nfc" android:required="false" /> iOS:NFCReaderUsageDescription HarmonyOS:ohos.permission.NFC_TAG

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

插件不采集任何数据

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