背景和问题:
我正在编写一个必须与 NFC MiFare Ultralight 标签通信的 React Native 应用程序。我有 NXP NTAG I2C PLUS ISO14443-3 标签。
我为此使用了react-native-nfc-manager库。在 android 上,我没有注意到 iOS 端有任何问题。我正在 iOS 13 和 14 上进行测试,我的设备是 iPhone 7。
我能够找到并连接到 NFC Mifare Ultralight 标签(也可以读取和写入它们),但在 75% 的情况下,我在通信过程中收到以下错误:
[CoreNFC] 00000002 803f43f0 -[NFCTagReaderSession transceive:tagUpdate:error:]:771 Error Domain=NFCError Code=100 "Tag connection lost" UserInfo={NSLocalizedDescription=Tag connection lost}
此问题仅出现在 iOS 上。安卓运行良好。
我如何沟通:
- 我将 NDEF 和 TAG 格式添加到…readersession.formats 的权利文件中。
- 我还为隐私 - NFC 扫描使用说明的 info.plist 添加了价值。
- 我请求 NfcTech.MifareIOS 技术并调用 NfcManager.sendMifareCommandIOS() 方法,如图书馆的 MiFare 示例所示。我尝试使用其他发射器方法并请求其他技术类型,但在那些情况下我什至没有得到任何回应。
这就是我创建写入命令以及调用传输方法的方式:
// WRITE COMMAND looks like: [0xA2, Addr, datas]
const writeCommand = [0xa2, offset, data[0], data[1], data[2], data[3]];
const response = await this.transmit(writeCommand);
这就是我创建阅读命令的方式:
// FAST_READ COMMAND looks like: [0x3A, StartAddr, EndAddr]
const readCommand = [0x3a, offset, offset + readLength];
这是我的传输方法:
private async transmit(msg: number[]): Promise<number[]> {
...
const cmd = Platform.OS === 'ios' ? NfcManager.sendMifareCommandIOS : NfcManager.transceive;
return await cmd(msg);
}
我注意到并尝试过的:
- 我注意到 iPhone 对定位非常敏感。如果我将设备保持在某个位置,我也可以达到 80% 的成功率。我也注意到,如果我将手机留在标签上,我会更频繁地收到此错误。一次沟通后把手机拿走,再放回去,效果更好。
- 当我在通信后添加一些睡眠(例如 100 毫秒)时,通信似乎更稳定。由于通讯的数量,我等不及了。即使我等待我得到错误,但次数更少。
- 我看到了一个非常相似的问题,它描述了一个 CRC 问题,当您尝试发送 CRC 时会出现该问题,但 iOS 已经自动添加了该问题。我没有发送 CRC(这是上述问题中的解决方案),所以这应该不是问题。
- 还看到了类似问题的以下问题,但我有另一种类型的标签 - ISO-14443,我还能够连接并与上述问题中没有的标签通信。
- 尝试在每次通信后使会话无效,但无助于稳定连接。
- 尝试了多个标签(但标签类型相同),但得到了相同的结果。
我非常感谢任何可以帮助我解决这个问题的想法。