#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?_____________________________________________")!
Я не знаю, почему
- Мне нужна была более длинная строка (63 символа)
- Почему эта строка по-прежнему составляла всего 56 байт
- Что отличается в конструкторе
- Зачем мне на самом деле понадобились подчеркивания, поскольку пробелы не регистрировались в качестве фонового тега
Возможно, кто-то еще сможет объяснить это решение. Тем не менее, это работает!
Комментарии:
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
не менее, интересно использовать десятичный код для thehttps://
! Спасибо