我正在尝试读取mifare标签的UID。
查看示例,我经常看到以下方法:
func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
if case let NFCTag.miFare(tag) = tags.first! {
print(tag.identifier as NSData)
}
}
但是,当将其放入我的项目时,不会调用该方法。
我还注意到xCode发出警告,该警告几乎与可选协议相同,只是它使用 NFCNDEFTag 而不是 NFCTag 。
当我尝试更新时,该方法确实被调用。但是然后我在尝试将标签定义为该方法中的mifare时遇到了麻烦。我收到错误消息“模式不能匹配'NFCNDEFTag'类型的值。
以下代码:
@available(iOS 13.0, *)
func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
print("in did detect tags")
let tag = tags.first!
session.connect(to: tag) { (error: Error?) in
session.connect(to: tag) { (error: Error?) in
if case let .mifare(mifareTag) = tag {
// can access tag identifier here?
}
}
}
}
答案 0 :(得分:0)
您初始化的会话应该是NFCTagReaderSession https://developer.apple.com/documentation/corenfc/nfctagreadersession
您应该遵守NFCTagReaderSessionDelegate https://developer.apple.com/documentation/corenfc/nfctagreadersessiondelegate?language=objc
答案 1 :(得分:0)
这是我实现的方式:
func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag] {
let tag = tags.first!
readerSession?.connect(to: tag, completionHandler: { error in
if case let .miFare(miFare) = tag {
var byteData = [UInt8]()
miFare.identifier.withUnsafeBytes { byteData.append(contentsOf: $0) }
var uid = "0"
byteData.forEach {
uid.append(String($0, radix: 16))
}
print("UID: \(uid)")
}
})
}