ios - 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 获取消息记录的有效负载类型。我是否在这里遗漏了什么,或者确实需要两次不同的阅读课程才能获得我感兴趣的信息?提前致谢。
解决方案
我终于找到了解决方案:)
您实际上可以在您的委托函数中读取 NDEF 数据,NFCTagReaderSession
但在 iOS 13 中您必须使用另一个委托。
在 iOS 11 和 12 中似乎NFCTag
是一个协议,但在 iOS 13 中NFCTag
变成了一个枚举,并且以前的协议被重命名为__NFCTag
.
可以将an__NFCTag
转换为 an 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
})
}
}
}
推荐阅读
- c# - 使用 C# 中的 Windows 应用程序在 SharePoint 中上传文件时出现异常
- flutter - 如何在 Flutter 每个视图模型中正确组织我的 API 调用?
- c++ - c++ AVX512内在等效于_mm256_broadcast_ss()?
- c++ - 如何从 txt 文件中读取数字并确保它们存在
- keras - 为什么我会根据预测的顺序从 Keras LSTM 网络得到完全不同的预测?
- amazon-web-services - Ansible 动态库存与静态组和动态子代
- safari - Nuxtjs - 在 Safari 上第一次 SSR 加载失败后,在 asyncData 中调用 Axios API
- r - R flexdashboard:如何在文件路径中嵌入具有反应值的视频?
- docker - ElasticSearch java.io.IOException:无法在 docker 中读取 ...
- angular - Angular/Typescript - 在返回承诺语句中调用方法