Фоновое считывание NFC-метки на iOS — не найдено полезных данных

#ios #swift #nfc #core-nfc

#iOS #swift #nfc #ядро-nfc

Вопрос:

Я пытаюсь реализовать фоновое чтение тегов NFC для приложения iOS. Используемый мной тег NFC имеет особые требования к формату, который должен быть записан — в частности, только вторая запись может быть URI, и она должна быть длиной 56 символов.

Я создал и написал следующее сообщение NDEF:

         let message = NFCNDEFMessage(records: [
            NFCNDEFPayload(
                format: .nfcExternal,
                type: "-- omitted --".data(using: .utf8)!,
                identifier: "".data(using: .utf8)!,
                payload: "-- omitted --".data(using: .utf8)!
            ),
            NFCNDEFPayload(
                format: .nfcWellKnown,
                type: "U".data(using: .utf8)!,
                identifier: "".data(using: .utf8)!,
                payload: "https://apple.com?                                      ".data(using: .utf8)!
            ),
            NFCNDEFPayload(
                format: .nfcWellKnown,
                type: "T".data(using: .utf8)!,
                identifier: "".data(using: .utf8)!,
                payload: "-- omitted --".data(using: .utf8)!
            )
        ])
 

Теперь, когда я прикасаюсь к устройству iOS к телефону, я получаю подсказку (оригинал в скобках, сначала предполагается перевод на английский):

ОБНАРУЖЕНА NFC-МЕТКА (NFC-TAG GEDETECTEERD)

Не найдено полезных данных (зеленый bruikbare gegevens gevonden)

Я пытался заменить пробел на ?_______... или универсальными ссылками, но я всегда получаю один и тот же ответ. Когда я пытаюсь прочитать другие теги NFC, которые я не записывал, я не получаю приглашение, поэтому я знаю, что новое сообщение активирует фоновое чтение, но я не могу понять, почему оно не может быть прочитано.

Я только предполагаю, что iOS не декодирует массив .utf8 байтов, но я не знаю, как еще сохранить / закодировать сообщение в теге NFC

Ответ №1:

Я заменил:

 NFCNDEFPayload(
   format: .nfcWellKnown,
   type: "U".data(using: .utf8)!,
   identifier: "".data(using: .utf8)!,
   payload: "https://apple.com?                                      ".data(using: .utf8)!
),
 

с:

 NFCNDEFPayload.wellKnownTypeURIPayload(string: "https://apple.com?_____________________________________________")!
 

Я не знаю, почему

  1. Мне нужна была более длинная строка (63 символа)
  2. Почему эта строка по-прежнему составляла всего 56 байт
  3. Что отличается в конструкторе
  4. Зачем мне на самом деле понадобились подчеркивания, поскольку пробелы не регистрировались в качестве фонового тега

Возможно, кто-то еще сможет объяснить это решение. Тем не менее, это работает!

Комментарии:

1. Надеюсь, мой ответ ответит на некоторые из этих вопросов, т.Е. Почему он короче (потому что схема URI NDEF пытается быть эффективной и кодирует общие префиксы URI в один байт, например, 8 байт https:// в 1 байтовый код)

Ответ №2:

Итак https://developer.apple.com/documentation/corenfc/adding_support_for_background_tag_reading говорит

Примечание
. Фоновое считывание тегов не поддерживает пользовательские схемы URL. Вместо этого используйте универсальные ссылки.

С

 NFCNDEFPayload(
   format: .nfcWellKnown,
   type: "U".data(using: .utf8)!,
   identifier: "".data(using: .utf8)!,
   payload: "https://apple.com?                                      ".data(using: .utf8)!
),
 

Я не думаю, что вы используете одну из поддерживаемых схем URL-адресов из связанных документов, вы используете «Пользовательскую схему URL», которую, по его словам, она не поддерживает.

Используя функцию справки NFCNDEFPayload.wellKnownTypeURIPayload , это, вероятно, декодирует вашу строку в поддерживаемую схему URL.

Документы не ясны и ссылаются на спецификацию NDEF для URI, которая находится по адресу https://github.com/haldean/ndef/blob/master/docs/NFCForum-TS-RTD_URI_1.0.pdf

Итак, я предполагаю, что для выполнения более ручного создания NFCNDEFPayload вам нужно правильно отформатировать его следующим образом

 NFCNDEFPayload(
   format: .nfcWellKnown,
   type: "U".data(using: .utf8)!,
   identifier: "4".data(using: .utf8)!,
   payload: "apple.com?".data(using: .utf8)!
),
 

Как 4 и десятичный код для https:// префикса

Комментарии:

1. Из тех же документов разработчика Apple: Background tag reading supports the following URL schemes: [ http/https ... ] . Тем 4 не менее, интересно использовать десятичный код для the https:// ! Спасибо