如何在iOS中格式化一个空的(NDEFFormatable)NFC标签

时间:2019-12-09 10:58:31

标签: ios nfc core-nfc

我目前正在使用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
        }
    }
}

1 个答案:

答案 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