Как отформатировать пустой (NDEFFormatable) тег NFC в iOS

В настоящее время я работаю с некоторыми тегами 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
        }
    }
}

person AlexVogel    schedule 09.12.2019    source источник


Ответы (1)


Некоторые источники говорят, что 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/ )

Но, возможно, это больше похоже на карту типа 5, к спецификациям которой у меня нет доступа, но что-то подобное можно сделать для типа 5 как для типа 2 (вы можете использовать различные приложения для Android, такие как приложение Taginfo от NXP, чтобы сравнить отформатированный NDEF тип V тег с неформатированным, чтобы увидеть, являются ли это блоками 3 и 4 на картах типа V)

Но для типа 2

В разделе 6.4.1 показано, как он определяет, что это карта, отформатированная в формате NDEF.

Для карт Типа 2 блок 03 должен иметь контейнер возможностей NDEF размером 4 байта. Многие карты имеют этот предустановленный заводской вариант, если нет, вам нужно записать 4-байтовый контейнер возможностей в блок 03.

Формат контейнера указан в спецификации, но ниже приводится сводка:

Байт 0 = E1h указывает, что внутри тега присутствуют данные NDEF.

Байт 1 = 10h указывает на поддержку версии 1.0 (старший номер 1h, младший номер 0h) документа отображения (т. е. версии этой спецификации). - Версию 1.0 я считаю последней версией.

Байт 2 = размер области данных, поэтому значение зависит от карты, но значение представляет собой размер области данных, разделенный на 8 и представленный в шестнадцатеричном формате. например 128 байт хранения данных указаны значением равным 10h

Байт 3 = относится к безопасности, а значение 0h указывает, что доступ на запись предоставляется без какой-либо безопасности.


Затем вам нужно отформатировать карту с пустым сообщением TLV в блоке 4 для форматирования карты.

Пустое сообщение TLV в блоке 4

Байт 0 = 03h

Байт 1 = 00h

Байт 2 = FEh

Что в основном соответствует сообщению Start NDEF, сообщение имеет нулевую длину по размеру, сообщение End NDEF.


Я не делал ничего из этого на iOS, но кажется, что iOS предлагает низкоуровневый доступ для чтения и записи тегов ISO15693.

https://developer.apple.com/documentation/corenfc/nfciso15693tag/3043817-writesingleblock

person Andrew    schedule 11.12.2019