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

时间:2019-10-16 07:20:24

标签: ios swift nfc ios13

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

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

使用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获取消息记录的有效负载类型。我是否在这里遗漏了一些东西,或者确实有两个不同的阅读课程才能获得我感兴趣的信息?预先感谢。

1 个答案:

答案 0 :(得分:2)

我终于找到了解决方案:)

您实际上可以在NFCTagReaderSession的委托函数中读取NDEF数据,但是在iOS 13中,您必须使用另一个委托。

在iOS 11和12中,NFCTag似乎是一个协议,但在iOS 13中,NFCTag成为了枚举,以前的协议已重命名为__NFCTag

可以将__NFCTag强制转换为NFCNDEFTag,然后您可以照常读取NDEF数据。

要在委托函数中获得__NFCTag,您需要改用__NFCTagReaderSessionDelegate

要初始化会话,请在初始化器的__参数标签前加上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
      })
    }
  }
}