我目前正在使用NFC标签和iOS 13。
一个问题是,我的某些NFC标签是作为NDEFFormatable
交付的。我知道我必须先格式化标签才能使用NDEF。我可以使用第三方Android应用程序来做到这一点。但是我该如何使用自己的iOS应用程序呢?
当前,该标签被识别为“ ISO15693”标签,queryNDEFStatus方法的结果为.notSupported
。
我也曾尝试向该NFC标签写入一条授权消息,但iOS响应时显示错误消息“ NDEF标签为只读”
据我所知,您喜欢在其中添加一些重要部分:
session = NFCTagReaderSession(pollingOption: [.iso14443, .iso15693], delegate: self)
session?.alertMessage = "Bitte halten Sie das Gerät an den zu scannenden NFC Tag"
session?.begin()
...
func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
if tags.count > 1 {
// Restart polling in 500ms
let retryInterval = DispatchTimeInterval.milliseconds(500)
session.alertMessage = "Mehr als 1 NFC Tag gefunden. Bitte scannen Sie jeden Tag einzeln."
DispatchQueue.global().asyncAfter(deadline: .now() + retryInterval, execute: {
session.restartPolling()
})
return
}
let tag = tags.first!
// Connect to the found tag and perform NDEF message reading
session.connect(to: tag) { (error: Error?) in
if nil != error {
session.invalidate(errorMessage: "NFC Tag konnte nicht gelesen werden")
return
}
if case let NFCTag.iso15693(iso15693Tag) = tag{
iso15693Tag.queryNDEFStatus(completionHandler: { (ndefStatus: NFCNDEFStatus, capacity: Int, error: Error?) in
guard error == nil else {
session.invalidate(errorMessage: "Status des Tags konnte nicht gelesen werden")
return
}
switch ndefStatus {
case .notSupported:
//NDFEFFormatable tag is handled here !!!!
session.alertMessage = "Der Tag unterstützt das NFC Data Exchange Format (NDEF) nicht!"
session.invalidate()
case .readOnly:
//read tag
case .readWrite:
//read or write tag
@unknown default:
session.alertMessage = "Unbekannter Status"
session.invalidate()
}
})
} else if case let NFCTag.miFare(miFareTag) = tag { //check if we have a MiFare Tag
//other type of tags
} else {
session.invalidate(errorMessage: "Dieser Tag wird aktuell leider nicht unterstützt")
return
}
}
}
答案 0 :(得分:0)
一些消息来源说,iOS只能与已格式化的卡一起使用
https://help.gototags.com/article/nfc-tag-encoding-iphone/
但是您也许可以使用低级命令来编写正确的块来自己格式化卡。
您没有指定卡的类型,因此假设http://apps4android.org/nfc-specifications/NFCForum-TS-Type-2-Tag_1.1.pdf是2类卡(如果不是,其他规格位于http://apps4android.org/nfc-specifications/)
但可能更像是我无法访问规格的Type 5卡,但是对于Type 5(类型2)也可以做类似的事情(您可以使用各种Android应用(例如NXP的Taginfo App比较格式) NDEF V型标签,其中有一个未格式化的标签,以查看它也是V型卡上的第3块和第4块)
但对于类型2
第6.4.1节说明了如何检测到它是NDEF格式的卡。
对于类型2卡,块03必须具有4字节的NDEF能力容器,很多卡在出厂时都具有此预设,否则,您需要将4字节能力容器写入块03。
容器格式在规范中,但以下是摘要:-
字节0 = E1h表示标签中存在NDEF数据
字节1 = 10h表示支持映射文档的1.0版(主号1h,副号0h)(即,本规范的版本)。 -我相信1.0版是最新版本。
字节2 =数据区域的大小,因此是卡的特定值,但该值是数据区域大小除以8并以十六进制表示。例如表示128字节的数据存储值等于10h
字节3 =关于安全性,值0h表示授予的访问权限没有任何安全性
然后,您需要使用空白TLV消息格式化卡,以阻止第4步来格式化卡。
方框4中的空白TLV消息为
字节0 = 03h
字节1 = 00h
字节2 = FEh
基本上等同于开始NDEF消息,消息的长度为零,结束NDEF消息。
我在iOS上尚未完成任何操作,但似乎iOS确实提供了ISO15693标签的低级读写访问权限
https://developer.apple.com/documentation/corenfc/nfciso15693tag/3043817-writesingleblock