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



>我目前在基于 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获取消息记录的有效负载类型。我在这里错过了什么,还是确实需要两个不同的阅读课程来获取我感兴趣的信息?提前谢谢。

我终于找到了这个:)

的解决方案您实际上可以在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
})
}
}
}

我遇到了同样的问题,并在Apple的示例项目中找到了解决方案,我几乎不建议阅读。

仅供参考: 避免使用带有下划线的类和方法作为前缀,这可能会导致您在AppStore上拒绝应用程序。

相关内容

  • 没有找到相关文章

最新更新