更新记录

1.0.0(2026-01-26)

  • 新版发布

平台兼容性

uni-app(4.81)

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

uni-app x(4.81)

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

yt-nfc

开发文档

特别提醒

  • 购买本插件前,请先试用,请先试用,请先试用,确认满足需求之后再行购买。虚拟物品一旦购买之后无法退款。
  • 如有使用上的疑问、bug,可以进交流群联系作者;
  • 请在合法范围内使用,若使用本插件做非法开发,本方概不负责;
  • 可扫描右侧二维码安装Android示例demo,体验插件功能
  • iOS使用示例demo测试时,要先修改manifest中项目名称后再打包(名称长度尽量短一点),不然会因为名称过长,导致App启动不了。
  • iOS端需要再开发者中心iOS 开发者Certificates, Identifiers & Profiles/Identifiers/勾选NFC Tag Reading后重新生成描述文件打包测试,不明白可以进交流群询问作者。

插件主要功能

  • NFC检测
  • NDEF数据读取
  • NDEF数据写入
  • 扇区数据写入
  • 扇区数据读取
  • 支持iOS、Android,后续会适配纯血HarmonyOS

更多好用实惠插件

插件接入

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

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

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

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

注册监听回调

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

//完整代码
onLoad() {
            NFCManager.registrationCallback(res => {
                let functionName = `${res["functionName"]}`;
                let msg = `${res["msg"]}`;
                switch (functionName) {
                    case "onNDEFReadSuccess"://读取ndef数据成功回调
                        {
                            let ndefRecords = res["ndefRecords"] as Array<Map<string, any>>;
                            if (ndefRecords.length > 0) {
                                let ndefRecord = ndefRecords[0];
                                let typeNameFormat = ndefRecord["typeNameFormat"] as string
                                let type = ndefRecord["type"] as string
                                let typeHex = ndefRecord["typeHex"] as string
                                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["sector"];
                            let block = res["block"];
                            let data = res["data"];
                            console.log(`扇区数据读取成功--扇区:${sector}  块:${block}  数据:${data}`);
                        }

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

单独检测

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

NFCManager.startNFCDiscoverySession();

NDEF读取

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

NFCManager.startTagScanning()

NDEF数据写入

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

//uniapp 去掉as NFCManager.WriteNDEFOption类型转换,uniapp-x项目保留
NFCManager.writeNDEF({
  contentType: "URL",
  content: "https://ext.dcloud.net.cn/",
  tagFormat: "NFC_WELL_KNOWN",
  identifier: ""
} as NFCManager.WriteNDEFOption)

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 "onMifareReadSuccess"://扇区数据读取成功

//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~3
key string 密钥字符串,支持 "0B:XX:XX" 或 "0BXX" 格式,默认"FF:FF:FF:FF:FF:FF"
keyType string 密钥类型字符串,支持 "A" 或 "B" 默认A

设备是否支持NFC

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

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(res => {
                let functionName = `${res["functionName"]}`;
                let msg = `${res["msg"]}`;
                switch (functionName) {
                    case "onNDEFReadSuccess"://读取ndef数据成功回调
                        {
                            let ndefRecords = res["ndefRecords"] as Array<Map<string, any>>;
                            if (ndefRecords.length > 0) {
                                let ndefRecord = ndefRecords[0];
                                let typeNameFormat = ndefRecord["typeNameFormat"] as string
                                let type = ndefRecord["type"] as string
                                let typeHex = ndefRecord["typeHex"] as string
                                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["sector"];
                            let block = res["block"];
                            let data = res["data"];
                            console.log(`扇区数据读取成功--扇区:${sector}  块:${block}  数据:${data}`);
                        }

                        break;
                    case "onMifareWriteSuccess"://扇区数据写入成功
                        {
                            let sector = res["sector"];
                            let block = res["block"];
                            console.log(`扇区数据写入成功--扇区:${sector}  块:${block}`);
                        }
                        break;
                    case "onTagDetected"://标签检测回调
                        {
                            let idString = res["idString"] as string;
                            let tagType = res["tagType"] as string;
                            console.log(`检测到标签--唯一标识:${idString}  标签类型:${tagType}`)
                        }
                        break;
                    case "onError"://错误回调
                        {
                            console.log(msg);
                        }
                        break;
                    default:
                        break;
                }
            })
        },
        methods: {
            //nfc读取
            startTagScanning() {
                NFCManager.startTagScanning()
            },
            startNFCScan() {
                NFCManager.startNFCScan()
            },
            //ndef数据写入
            writeNDEF() {
                NFCManager.writeNDEF({
                    contentType: "URL",
                    content: "https://ext.dcloud.net.cn/",
                    tagFormat: "NFC_WELL_KNOWN",
                    identifier: ""
                } as NFCManager.WriteNDEFOption)
            },
            //扇区读取
            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

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

插件不采集任何数据

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