You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不移除设备的情况下通过代码重建NFC连接(react-native-nfc-manager)

解决React Native中Mifare Ultralight不移除设备重连NFC的问题

环境与问题描述

  • 技术栈:React Native 0.62.2,react-native-nfc-manager 3.10.1
  • 硬件:Android设备 + Mifare Ultralight NFC芯片
  • 需求流程:
    1. 设备靠近NFC标签建立连接
    2. 读取标签内容
    3. 写入请求头
    4. 主动断开连接,等待外部设备通过有线方式写入标签
    5. 不移除设备重新建立连接,读取更新后的内容
  • 故障点:主动调用NfcManager.cancelTechnologyRequest()断开后,不移除设备时再次调用requestTechnology会一直阻塞,仅移除再靠近标签才能正常建立连接

解决方案

1. 完整释放NFC资源并重启服务

单纯取消技术请求无法完全释放底层NFC资源,需要结合停止/重启NFC服务,再手动触发标签检测,让系统重新识别已靠近的标签。修改后的核心代码如下:

import { Platform } from 'react-native';
import NfcManager, { NfcTech, NfcEvents } from 'react-native-nfc-manager';

async function nfcOperationFlow(pageOffset, data, waitTime) {
    // 初始化NFC服务
    await NfcManager.start();

    // 第一次连接与读写
    await NfcManager.requestTechnology(NfcTech.MifareUltralight);
    const nfcTag = await NfcManager.getTag();
    const initialPages = await NfcManager.mifareUltralightHandlerAndroid.mifareUltralightReadPages(pageOffset);
    await NfcManager.mifareUltralightHandlerAndroid.mifareUltralightWritePage(pageOffset, data);

    // 主动断开并完全释放资源
    await NfcManager.cancelTechnologyRequest();
    await NfcManager.stop(); // 停止NFC服务,释放底层资源

    // 等待外部设备写入标签
    await new Promise(resolve => setTimeout(resolve, waitTime));

    // 重启NFC服务并准备重连
    await NfcManager.start();

    // 注册标签发现监听,处理已存在的标签
    const tagListener = async (tag) => {
        try {
            // 基于已发现的标签直接请求技术
            await NfcManager.requestTechnology(NfcTech.MifareUltralight, { tag });
            const updatedPages = await NfcManager.mifareUltralightHandlerAndroid.mifareUltralightReadPages(pageOffset);
            console.log('读取到更新后的内容:', updatedPages);
            
            // 清理监听,避免重复触发
            NfcManager.setEventListener(NfcEvents.DiscoverTag, null);
        } catch (err) {
            console.error('重连失败:', err);
            NfcManager.setEventListener(NfcEvents.DiscoverTag, null);
        }
    };
    NfcManager.setEventListener(NfcEvents.DiscoverTag, tagListener);

    // Android平台下强制触发标签检测
    if (Platform.OS === 'android') {
        await NfcManager.invokeTagTechCallback();
    }
}

2. 关键原理说明

  • Android系统在标签持续靠近时,不会主动重复发送标签发现广播,因此需要手动触发检测(invokeTagTechCallback)。
  • 停止并重启NFC服务,会重置系统的NFC状态,让系统重新扫描当前已存在的标签。
  • 通过DiscoverTag监听捕获已存在的标签实例,直接传入requestTechnology,避免等待系统重新触发发现事件。

3. 额外注意事项

  • 确保AndroidManifest.xml中配置了正确的NFC权限:
    <uses-permission android:name="android.permission.NFC" />
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
    
  • 部分旧版本Android设备可能需要额外处理前台调度(Foreground Dispatch),可以通过原生模块调用NfcAdapter.enableForegroundDispatch()来强制捕获标签。
  • 所有NFC异步操作必须按顺序执行,避免并行调用导致资源冲突。

内容的提问来源于stack exchange,提问作者vindom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:41:17