iOS - 在一个阅读 session 中同时获取 NFCTag 硬件 ID 和 NDEF 消息

标签 ios swift nfc ios13

我目前在基于 NFC 的 iOS 13 应用程序中实现特定功能时遇到问题。读取标签时,我想在一个 session 中获取唯一的硬件 ID 和 NDEF 消息。到目前为止,我已经检查了不同的示例项目,包括 Apple 提供的代码,并且能够获得我感兴趣的信息,但不是在同一个阅读 session 中。

我简化了以下代码片段以更好地关注问题(缺少错误检查等)。

使用 NFCTagReaderSession 获取唯一的硬件 id:

func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
    let tag = tags.first!

    session.connect(to: tag) { (error: Error?) in
        if case let .miFare(mifareTag) = tag {

            print(mifareTag.identifier as NSData) //this is the info I'm interested in

        }
    }
}

然而,消息记录的有效负载类型似乎仅在 NFCNDEFReaderSession 中可用:
func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {

        let tag = tags.first!
        session.connect(to: tag, completionHandler: { (error: Error?) in

            tag.queryNDEFStatus(completionHandler: { (ndefStatus: NFCNDEFStatus, capacity: Int, error: Error?) in


                tag.readNDEF(completionHandler: { (message: NFCNDEFMessage?, error: Error?) in
                    var statusMessage: String
                    if nil != error || nil == message {
                        statusMessage = "Fail to read NDEF from tag"
                    } else {
                        statusMessage = "Found 1 NDEF message"

                        let payload = message.records.first!

                        if let type = String(data: payload.type, encoding: .utf8) {
                            print("type:%@", type) //this is the info I'm interested in
                        }


                    }

                    session.alertMessage = statusMessage
                    session.invalidate()
                })
            })
        })
    }

如您所见,我可以使用 NFCTagReaderSession 获取硬件 ID,也可以使用 NFCNDEFReaderSession 获取消息记录的有效负载类型。我是否在这里遗漏了什么,或者确实需要两次不同的阅读类(class)才能获得我感兴趣的信息?提前致谢。

最佳答案

我终于找到了解决方案:)
您实际上可以在 NFCTagReaderSession 的委托(delegate)函数中读取 NDEF 数据。但在 iOS 13 中,您必须使用另一个委托(delegate)。
似乎在 iOS 11 和 12 NFCTag是一个协议(protocol),但在 iOS 13 NFCTag成为一个枚举并且之前的协议(protocol)被重命名为 __NFCTag .
一个 __NFCTag可以转换为 NFCNDEFTag然后你就可以像往常一样读取 NDEF 数据了。
获取 __NFCTag在您的委托(delegate)函数中,您需要使用 __NFCTagReaderSessionDelegate反而。
要初始化您的 session ,请在前面添加 __pollingOption初始化器的参数标签。
要连接到您需要使用的标签 __connect .
以下是如何读取标识符和 NDEF 数据。

func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [__NFCTag]) {
  let tag = tags.first!

  session.__connect(to: tag) { (error: Error?) in
    if let ndefTag = tag as? NFCNDEFTag {
      if let miFareTag = ndefTag as? NFCMiFareTag {
        // here you can get miFareTag.identifier like in your first code sample
      }
      
      ndefTag.readNDEF(completionHandler: { (message, error) in
        // here you can read NDEF data like in your second code sample
      })
    }
  }
}

关于iOS - 在一个阅读 session 中同时获取 NFCTag 硬件 ID 和 NDEF 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58407833/

相关文章:

java - Android 上带有 JMRTD 的外部 RFID 阅读器

ios - Swift 中等效的 android.content.BroadcastReceiver

ios - 我如何将 "pin" Sprite 转换为 Sprite Kit 中的其他 Sprite ?

iphone - IOS UITableView 检测表格下方的触摸 - 需要子类化?

ios - 如何使按钮图像像普通文本按钮一样改变颜色?

快速绘制半圆,未填充

iphone - 无法从加速度计、陀螺仪和 DeviceMotion 获取值

android - Nexus 7 支持哪些 NFC 标签? (2012)

ios - 使用 NSURLSessionDownloadTask 时使用 resumeData 的正确方法是什么?

android - 空 NFC 标签属于哪种 Intent 类型?