Использование Ios Core Nfc Framework для бесконтактного обмена данными

Основы IOS Core NFC Framework для бесконтактного обмена данными

Рамки NFC на базе iOS Core дают разработчикам возможность создавать приложения, которые читают и пишут теги Near Field Communication (NFC), обеспечивая быстрый, безопасный и прямой бесконтактный обмен данными. Поскольку технология NFC становится основным продуктом в розничной торговле, транспортировке, контроле доступа и многом другом, понимание того, как интегрировать эту структуру в ваше приложение iOS, открывает дверь к современному, свободному от трения пользовательскому опыту. Эта статья предоставляет всеобъемлющее, готовое к производству руководство по базовой структуре NFC - от начальной настройки и управления сеансами до расширенных функций и реального развертывания.

Краткий обзор NFC на iOS

Near Field Communication (NFC) - это стандарт беспроводной связи ближнего действия, который работает на частоте 13,56 МГц. Apple представила Core NFC Framework с iOS 11, первоначально ограниченный чтением тегов NFC Data Exchange Format (NDEF). Последующие версии iOS расширили возможности: iOS 13 добавила поддержку написания тегов NDEF и чтения фоновых тегов, в то время как iOS 14 и более поздние улучшили совместимость с тегами ISO-7816, ISO-15693 и FeliCa. Сегодня Core NFC доступен на iPhone 7 и позже, достигнув миллионов пользователей.

NFC работает на расстоянии нескольких сантиметров, что делает его идеальным для сценариев «клик к взаимодействию», таких как оплата, лояльность, билетирование и проверка личности. Рамка абстрагирует радиосвязь низкого уровня, позволяя разработчикам сосредоточиться на анализе и обработке данных, полученных из тегов NFC.

Основные возможности NFC Framework

Понимание того, что может (и не может) сделать базовая структура NFC, имеет важное значение перед началом разработки.

Заметные ограничения: Core NFC не поддерживает обмен данными между одноранговыми устройствами, эмуляция карт на основе хоста (HCE) не доступна на iOS (Apple Pay использует другой путь защищенных элементов), а контроллер NFC доступен исключительно для приложения переднего плана, если не использовать фоновое чтение.

Предпосылки проекта

Аппаратные и программные требования

Получение основного права NFC

В вашем проекте Xcode перейдите к Signing & Capabilities и добавьте Near Field Communication Tag Reading. Это действие добавляет необходимый файл прав и гарантирует, что ваше приложение может запросить доступ к оборудованию NFC.

Настройка вашего приложения для NFC

Info.plist Ключ

Добавьте ключ к вашему со строкой, объясняющей, почему вашему приложению нужен доступ к NFC. Эта строка представлена пользователю во время первой сессии NFC.

<key>NFCReaderUsageDescription</key>
<string>This app uses NFC to read your loyalty cards and event tickets.</string>

Если ваше приложение пишет на теги, вы также должны добавить ключ (iOS 13+).

Режимы фона

Чтобы включить чтение фоновых тегов, включите возможность Режимы фона и проверьте Прочтение тегов ближнего поля связи . Кроме того, ваше приложение должно реализовать и быть готовым обрабатывать обнаружение тегов в фоновом режиме.

Основной жизненный цикл NFC

Центральным объектом для чтения тегов NDEF является .Сеанс начинается, когда вы звоните и заканчивается автоматически, когда тег читается (если ) или когда вы вручную его отменяете.В ходе сеанса система показывает системное предупреждение пользовательского интерфейса, сообщающее пользователю удерживать устройство рядом с тегом.

Начало сеанса

import CoreNFC

class NFCHandler: NSObject, NFCNDEFReaderSessionDelegate {
 private var session: NFCNDEFReaderSession?

 func beginScanning() {
 guard NFCNDEFReaderSession.readingAvailable else {
 print("NFC is not available on this device.")
 return
 }
 session = NFCNDEFReaderSession(delegate: self, queue: DispatchQueue.main, invalidateAfterFirstRead: true)
 session?.alertMessage = "Hold your iPhone near the tag."
 session?.begin()
 }
}

Обработка делегатских отзывов

Внедрить два необходимых метода делегирования полномочий:

Пример осуществления:

func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
 for message in messages {
 for record in message.records {
 let payload = String(data: record.payload, encoding: .utf8) ?? "Unknown"
 print("NDEF Record type: \(record.typeNameFormat), payload: \(payload)")
 }
 }
}

func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
 if let readerError = error as? NFCReaderError {
 switch readerError.code {
 case .readerSessionInvalidationErrorUserCanceled:
 print("User cancelled scanning.")
 case .readerSessionInvalidationErrorSessionTimeout:
 print("Session timed out.")
 default:
 print("Session error: \(error.localizedDescription)")
 }
 }
}

Читать NDEF Tags в глубине

NFC-теги обычно хранят данные в формате NDEF. NDEF-сообщение может содержать одну или несколько записей, каждая с типом, идентификатором и полезной нагрузкой. Общие типы записей включают (обычный текст), (URL) и (богатый контент).

Скачать Record Payloads

Для интерпретации полезной нагрузки проверьте данные и :

func handleRecord(_ record: NFCNDEFPayload) {
 switch record.typeNameFormat {
 case .nfcWellKnown:
 if record.type == NFCTypeNameFormat.wellKnownTypeText {
 let textPayload = String(data: record.payload, encoding: .utf8) ?? ""
 print("Text: \(textPayload)")
 } else if record.type == NFCTypeNameFormat.wellKnownTypeURI {
 let uriPayload = String(data: record.payload, encoding: .utf8) ?? ""
 print("URI: \(uriPayload)")
 }
 case .absoluteURI:
 let absoluteURI = String(data: record.payload, encoding: .utf8) ?? ""
 print("Absolute URI: \(absoluteURI)")
 default:
 print("Unhandled type name format: \(record.typeNameFormat)")
 }
}

Написание тегов NDEF

Начиная с iOS 13, вы можете писать сообщения NDEF на совместимые теги, используя (или комбинированный с возможностью записи).

Вот пример компактного использования с поддержкой записи:

func writeToTag() {
 let session = NFCNDEFReaderSession(delegate: self, queue: .main, invalidateAfterFirstRead: false)
 session.alertMessage = "Hold your iPhone near the tag to write."
 session.begin()
}

func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
 guard let tag = tags.first else { return }
 session.connect(to: tag) { error in
 guard error == nil else { return }
 // Create an NDEF message
 let payload = NFCNDEFPayload(
 format: .nfcWellKnown,
 type: NFCTypeNameFormat.wellKnownTypeURI.data(using: .utf8)!,
 identifier: Data(),
 payload: "https://example.com".data(using: .utf8)!
 )
 let message = NFCNDEFMessage(records: [payload])
 tag.queryNDEFStatus { status, _, error in
 guard status == .readWrite, error == nil else { return }
 tag.writeNDEF(message) { error in
 if error == nil {
 print("Write successful.")
 }
 session.invalidate()
 }
 }
 }
}

Примечание: Написание работает только с перезаписываемыми тегами (тип 2, тип 4 и т. Д.) Некоторые теги (например, MIFARE Classic) могут потребовать специальной обработки или могут быть заблокированы.

Справочная тег Reading

При включенном соответствующем правовом и фоновом режиме ваше приложение может обнаруживать теги NFC, даже если они не находятся на переднем плане. Система запускает или возобновляет ваше приложение и доставляет данные тегов теми же методами делегатов. Вы должны убедиться, что ваше приложение обрабатывает теги быстро, так как фоновая сессия имеет ограниченное время.

Ключевые моменты для чтения фона:

Расширенный NFC: ISO-7816 и APDU

Для приложений, требующих прямой связи с защищенным элементом внутри карты (например, платежные терминалы, транзитные карты, государственные идентификаторы), используйте объекты или . Это позволяет отправлять и принимать команды APDU, как определено в стандарте ISO-7816-4.

Пример: общение с картой MIFARE DESFire

func readerSession(_ session: NFCReaderSession, didDetect tags: [NFCISO7816Tag]) {
 guard let tag = tags.first else { return }
 session.connect(to: tag) { error in
 guard error == nil else { return }
 // Send SELECT command
 let selectCommand = NFCISO7816APDU(
 instructionClass: 0x00,
 instructionCode: 0xA4,
 p1Parameter: 0x04,
 p2Parameter: 0x00,
 data: Data([0xA0, 0x00, 0x00, 0x03, 0x00, 0x00]),
 expectedResponseLength: -1
 )
 tag.sendCommand(apdu: selectCommand) { response, sw1, sw2, error in
 if error == nil {
 print("Command succeeded, SW1=\(sw1), SW2=\(sw2)")
 }
 }
 }
}

Расширенное использование тегов ISO-7816 требует глубокого понимания набора команд целевой карты. Основная документация NFC Apple предоставляет полную ссылку на API.

Вопросы безопасности и конфиденциальности

NFC на iOS разработан с конфиденциальностью и безопасностью на переднем крае:

Расширены реальные случаи использования

Core NFC обеспечивает широкий спектр бесконтактных взаимодействий:

Для вдохновения см. Сессия WWDC 2020 от Apple по NFC и официальный код образца Core NFC .

Оптимизация производительности и лучшие практики

Устранение общих проблем

ProblemSolution
NFCNDEFReaderSession.readingAvailable returns falseEnsure the device is iPhone 7 or later. Check that the NFC capability is enabled in Xcode and the entitlement file is present.
Session starts but no tag is detectedMake sure the tag is NDEF‑formatted and placed correctly near the top‑back of the iPhone (near the camera). Some thick cases can interfere.
App rejected due to missing usage descriptionAdd both NFCReaderUsageDescription and (if writing) NFCWriteAccessUsageDescription to Info.plist.
Background reading not triggeringEnable the “Near Field Communication Tag Reading” background mode. Also ensure the app was terminated properly (not force‑killed).
Writing fails with “tag not writable”Check if the tag is locked or read‑only. Some tags require a password before writing.

Будущее NFC на iOS

Apple продолжает развивать Core NFC с каждым выпуском iOS. Слухи и новые возможности включают расширенную поддержку ISO-15693 (используется в библиотечных книгах и некоторых тегах инвентаря), потенциальные улучшения дальности чтения и более глубокую интеграцию с Wallet и Express Mode. Разработчики должны следить за основными заметками выпуска NFC, чтобы оставаться в курсе.

Заключение

Освоение жизненного цикла сеанса, обработки NDEF и продвинутой связи с тегами позволяет доставлять все, от простого сканирования визитной карточки до сложных систем контроля доступа. Начните с создания минимального считывателя, а затем расширяйте возможности записи и фона по мере необходимости вашего сценария использования. С миллионами iPhone, оснащенных NFC, в этой области возможность создавать бесшовные, основанные на использовании возможности никогда не были больше.