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

问题描述 投票:0回答:1

我目前正在使用某些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
        }
    }
}
ios nfc core-nfc
1个回答
0
投票

[一些消息来源说,iOS只能使用已经格式化的卡

https://help.gototags.com/article/nfc-tag-encoding-iphone/

但是您可能可以使用低级命令来编写正确的块来自己格式化卡。

您没有指定卡的类型,因此假设它是类型2,http://apps4android.org/nfc-specifications/NFCForum-TS-Type-2-Tag_1.1.pdf(如果不是,则其他规格位于http://apps4android.org/nfc-specifications/处]

但是可能更像是我无法访问规格的Type 5卡,但是对于Type 5和Type 2也可以做类似的事情(您可以使用各种Android应用(例如NXP的Taginfo应用来比较格式化的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

© www.soinside.com 2019 - 2024. All rights reserved.