React native:调用 requestTechnology 并扫描 NFC 卡后意图改变

React native: intent changed after requestTechnology called and NFC card scanned

我目前正在开发一个简单的应用程序,它可以扫描 NFC 标签并从中读取数据。为了实现它,我遵循了 this example here.

为了测试,我使用了真实的 android 设备(三星 Galaxy J6)和 Mifare NFC 卡。

应用程序启动时,一切正常,NfcManager 已成功启动,标签事件已注册(使用NfcManager.registerTagEvent),但问题出现在requestTechnology已调用并扫描NFC卡。

我注意到的不同之处在于 Android 中的意图:在 运行 requestTechnology 和针对 phone 扫描卡片之前,意图和附加到它的动作看起来 like this => 动作在主线程上。

在那之后,意图和行动看起来像 this。

从主线程改变了动作,我觉得很奇怪。

Android 代码与上面 link 中给出的代码完全相同,React Native 中的代码如下所示:

 _read = async () => {
    try {
      const enabled = await NfcManager.isEnabled();
      console.warn('Enabled: ', enabled);

      await NfcManager.registerTagEvent((tag) => {
        console.warn('Tag Discovered', tag);
      }, 'Hold your device over the tag', true);
  
      let tech = Platform.OS === 'ios' ? NfcTech.MifareIOS : [NfcTech.MifareClassic, NfcTech.NfcA];
      let resp = await NfcManager.requestTechnology(tech);

      let tag = await NfcManager.getTag()
        .then(() => { console.warn('Tag: ', tag)})
        .catch((err) => console.warn('Tag error: ', err));
     
      {...}

      // this._cleanUp();
    } catch (ex) {
      console.warn(ex);
      this._cleanUp();
    }
  }

除此之外,方法 requestTechnology 只有在应用程序进入后台然后立即再次进入前台时才会解决。这似乎也很奇怪......

有谁知道如何解决这些问题并启动 NFC 卡读取进程和 运行?

感谢您的帮助!

我不确定你为什么要看 Intent 动作,因为它对 NFC 真的没有意义。

Android 如何处理 NFC 的一些背景应该有助于解释它。

在 Android 中,所有标签检测都由系统 NFC 处理 service/App。

当您的应用程序不是 运行 并且检测到 NFC 标签时,系统服务会在看到该类型的标签时判断是否有任何应用程序请求启动。然后,它制作一个 Intent 来让 System Launcher 启动您应用程序的主要 Activity,并在 Intent 的附加部分中捆绑有关 NFC 数据的信息,以便系统启动器传递在 Intent to your app at Launch time.

当你在做requestTechnology你的应用程序已经运行并且你告诉系统NFC服务将NFC数据直接传递给你的应用程序时,系统启动器不需要参与因为您的应用已经 运行.

现在 Android 有两种方法可以将此数据直接传递到您的 运行 应用程序,enableForegroundDispatch 或后者更好 enableReaderMode.

您将 react-native-nfc-manager 配置为使用较旧的 enableForegroundDispatch,它告诉系统 NFC 服务将标签详细信息直接发送到您的 运行 Activity。所以它不需要添加一个Action来告诉系统Launcher要做什么。但是要将 Intent 和包含有关标签数据的额外内容直接传送到您的应用程序,唯一的方法就是基本上重新启动您的应用程序,这会导致 PauseResume .

但是 react-native-nfc-manager 会为您处理所有这些,因此您无需担心 Intent

中的内容

请注意,您可以配置 react-native-nfc-manager 以使用 enableReaderMode 而不是重载 Intent 来将此数据传递给您,如果基本上在您的 运行 应用程序中创建一个线程并提供直接线程标签数据,因此不需要暂停和恢复您的应用程序(此外,您可以使用这种更新的方法更好地控制诸如 NFC 检测声音之类的东西)

总的来说,您所看到的行为是正常的,没有什么是您应该担心或有问题的。

注意 iOS 以完全不同的方式处理此问题,但 react-native-nfc-manager 同样通过它的 iOS 特定方法处理此问题。