我正在使用 Flutter 开发一个 Android+iOS 应用程序,它有几个用户交互屏幕和 NFC 屏幕。
在 NFC 屏幕上,用户连续点击手机(就像我们处理 Android 波束数据传输一样):一部手机是 Android 手机,它运行应用程序并发送 NFC NDEF 消息,就像本例中一样。
在第二部手机上,带有 NFC 屏幕的“我的应用程序”正在运行,并使用nfc_in_flutter(flutter 中只有 3 个 nfc 插件,这是当前似乎唯一维护的插件)读取 NDEF 并显示在屏幕上。
这种情况在 Android 设备上运行良好,但是在 iOS 设备上,当我点击 Android 设备时,什么也没有发生。它不读。
我使用 iOS 设备测试了简单的 NFC 标签(不是 Android 设备),它读取了标签。有人可以解释一下原因是什么吗?
以下是我的假设,如果我错了,请纠正我:由于iOS仅支持NDEF格式而不支持HCE,所以我应该将NDEF从Android发送到iOS。
我对主机卡模拟的了解:
为了使设备像卡一样工作(或使用 HCE),应用程序需要创建 HostApduService。当此服务运行时,手机(以及应用程序本身)能够识别阅读器,如果一切正常,它会发送有效负载。消息的格式是 IsoDep(不是 NDEF)。
另一方面,阅读器端发送 ADPU 来建立连接,如果正常,则接收有效负载。
在上面的示例中,发送方创建 NDEF 消息,并且不充当卡 (HCE),因为没有创建 HostApduService。
那么,如果 iOS 支持 NDEF 消息,为什么 iOS 设备不读取 Android 设备上的消息呢?
问题标题可能有点令人困惑。我会尝试解释更多细节。
我正在编写一个 flutter 插件来使用 NFC。
我有示例 Android Activity,它在收到 NDEF 消息时触发 onNewIntent()。此时消息有效负载就可以使用了。
class MainActivity : AppCompatActivity() {
private var mNfcAdapter: NfcAdapter? = null
private var mPendingIntent: PendingIntent? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mNfcAdapter = NfcAdapter.getDefaultAdapter(this)
mPendingIntent = PendingIntent.getActivity(
this, 0,
Intent(this, this.javaClass)
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0
)
}
override fun onResume() {
super.onResume()
mNfcAdapter?.enableForegroundDispatch(this, mPendingIntent, null, null)
}
override fun onPause() {
super.onPause()
mNfcAdapter?.disableForegroundDispatch(this)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages …Run Code Online (Sandbox Code Playgroud)