uniapp NFC开发全攻略
NFC功能需要真机测试,部分Android机型需要开启NFC开关。写入操作时需保持标签与设备接触直到完成。iOS系统对NFC功能有严格限制,仅支持特定场景的NFC读取。NDEF消息格式遵循NFC论坛标准,支持文本、URI、智能海报等数据类型。写入前应检查标签是否可写,避免对只读标签进行操作。
·
实现NFC碰一碰功能的基础配置
在manifest.json中配置NFC权限和功能声明:
{
"app-plus": {
"distribute": {
"android": {
"permissions": [
"android.permission.NFC"
],
"features": [
{
"name": "android.hardware.nfc",
"required": true
}
]
}
}
}
}
检测设备NFC支持情况
通过uni.getSystemInfo检测设备NFC支持:
uni.getSystemInfo({
success(res) {
if (!res.nfcEnabled) {
uni.showToast({ title: '设备不支持NFC', icon: 'none' });
}
}
});
监听NFC标签发现
在页面生命周期中注册和移除NFC监听:
onLoad() {
this.startNfcDiscovery();
},
onUnload() {
this.stopNfcDiscovery();
},
methods: {
startNfcDiscovery() {
plus.nfc.addEventListener('discovered', this.onNfcDiscovered);
plus.nfc.startDiscovery();
},
stopNfcDiscovery() {
plus.nfc.removeEventListener('discovered', this.onNfcDiscovered);
plus.nfc.stopDiscovery();
}
}
处理NFC标签数据
实现标签发现回调函数:
onNfcDiscovered(res) {
const tag = res.tag;
if (tag.techList.includes('android.nfc.tech.Ndef')) {
const ndef = plus.android.invoke(tag, 'getTech', 'android.nfc.tech.Ndef');
const ndefMessage = plus.android.invoke(ndef, 'getNdefMessage');
const records = plus.android.invoke(ndefMessage, 'getRecords');
// 解析NDEF记录
for (let i = 0; i < records.length; i++) {
const record = records[i];
const payload = plus.android.invoke(record, 'getPayload');
const text = String.fromCharCode.apply(null, payload);
console.log('NFC数据:', text);
}
}
}
写入数据到NFC标签
创建NDEF消息并写入标签:
writeToNfcTag(text) {
const NdefRecord = plus.android.importClass('android.nfc.NdefRecord');
const NdefMessage = plus.android.importClass('android.nfc.NdefMessage');
// 创建文本类型的NDEF记录
const textBytes = Array.from(text).map(c => c.charCodeAt(0));
const textRecord = new NdefRecord(
0x01, // TNF_WELL_KNOWN
0x02, // RTD_TEXT
new ArrayBuffer(0),
textBytes
);
// 创建NDEF消息
const ndefMessage = new NdefMessage([textRecord]);
// 写入标签
plus.nfc.writeNdefMessage(ndefMessage, () => {
uni.showToast({ title: '写入成功', icon: 'success' });
}, (err) => {
uni.showToast({ title: `写入失败: ${err}`, icon: 'none' });
});
}
Android权限动态申请
在需要时动态请求NFC权限:
requestNfcPermission() {
const main = plus.android.runtimeMainActivity();
const Permission = plus.android.importClass('android.Manifest$permission');
const ActivityCompat = plus.android.importClass('androidx.core.app.ActivityCompat');
if (ActivityCompat.checkSelfPermission(main, Permission.NFC) !== 0) {
ActivityCompat.requestPermissions(main, [Permission.NFC], 1001);
}
}
注意事项
NFC功能需要真机测试,部分Android机型需要开启NFC开关。写入操作时需保持标签与设备接触直到完成。iOS系统对NFC功能有严格限制,仅支持特定场景的NFC读取。
NDEF消息格式遵循NFC论坛标准,支持文本、URI、智能海报等数据类型。写入前应检查标签是否可写,避免对只读标签进行操作。
更多推荐
所有评论(0)