Использование 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, имеет важное значение перед началом разработки.
- NDEF tag reading — Прочитайте сообщения NDEF из совместимых тегов NFC (ISO 14443, FeliCa и ISO 15693 в более поздних версиях iOS).
- NDEF tag writing — Напишите NDEF-сообщения на перезаписываемые теги (iOS 13+).
- Настольный тег чтения — Обнаруживайте и читайте теги NFC даже тогда, когда ваше приложение находится в фоновом режиме (iOS 13+).
- ISO-7816 и ISO-14443-4 связь — обмен блоками данных протокола приложений (APDU) для платежей, контроля доступа и правительственных приложений ID.
- Пользовательская команда отправки — Отправляйте команды, принадлежащие MIFARE и другим картам, при условии, что у вас есть необходимые права от поставщика MIFARE/NXP.
Заметные ограничения: Core NFC не поддерживает обмен данными между одноранговыми устройствами, эмуляция карт на основе хоста (HCE) не доступна на iOS (Apple Pay использует другой путь защищенных элементов), а контроллер NFC доступен исключительно для приложения переднего плана, если не использовать фоновое чтение.
Предпосылки проекта
Аппаратные и программные требования
- iPhone 7 или более поздней версии (iPhone SE, 6s и более ранние модели не имеют аппаратной поддержки NFC для Core NFC).
- Xcode 12 или более поздней версии (для поддержки чтения и записи).
- iOS 13+ рекомендуется для полной записи NDEF и фоновых возможностей, хотя чтение самостоятельно работает обратно в iOS 11.
- Учетная запись Apple Developer (бесплатные учетные записи могут тестироваться на физических устройствах; для коммерческого распространения требуется платная учетная запись).
Получение основного права 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()
}
}
Обработка делегатских отзывов
Внедрить два необходимых метода делегирования полномочий:
- — Называется, когда одно или несколько сообщений NDEF успешно прочитаны.Способ получает массив объектов , каждый из которых содержит записи.
- — Называется, когда сеанс заканчивается, либо потому, что был прочитан тег, либо произошла ошибка (например, пользователь отменил, неподдерживаемый тег).
Пример осуществления:
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, даже если они не находятся на переднем плане. Система запускает или возобновляет ваше приложение и доставляет данные тегов теми же методами делегатов. Вы должны убедиться, что ваше приложение обрабатывает теги быстро, так как фоновая сессия имеет ограниченное время.
Ключевые моменты для чтения фона:
- Добавить Ближайший режим чтения тегов полевой связи фоновый режим.
- Система покажет предупреждение с именем вашего приложения и, возможно, FLT:25, который вы установили до окончания сеанса.
- Если приложение не работает в фоновом режиме, система запустит его в фоновом режиме на несколько секунд.
Расширенный 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 разработан с конфиденциальностью и безопасностью на переднем крае:
- Согласие пользователя — Сессия NFC всегда начинается с видимого системного оповещения.Пользователь должен активно удерживать устройство рядом с тегом; приложение не может бесшумно сканировать.
- Шифрование данных — Для чувствительных операций (например, оплаты) контроллер NFC взаимодействует с защищенным элементом внутри iPhone.Сами данные тегов не шифруются фреймворком — ваше приложение должно применять собственное шифрование, если это необходимо.
- Проверка содержимого тега — Всегда проверяйте полезную нагрузку из тегов NFC перед использованием.
- Право и ключи списка — Apple рассматривает ваше описание использования; неправильное использование возможностей NFC может привести к отказу от приложения.
Расширены реальные случаи использования
Core NFC обеспечивает широкий спектр бесконтактных взаимодействий:
- Бесконтактные платежи и лояльность — Интегрируйтесь с существующими платежными терминалами, оснащенными NFC, или используйте фреймворк для чтения карт с сохраненной стоимостью и точек лояльности.
- Контроль доступа — Замените физические ключи приложением iOS. Прочитайте учетные данные с бейджей доступа или напишите временные права доступа к тегам.
- Общественные перевозки — Внедрение функций «сжатия-читания» для транзитных проездов (например, метки FeliCa в Японии; ISO-14443 во многих европейских системах).
- Умная упаковка — позволяет пользователям нажимать на пакеты продуктов, чтобы просматривать информацию о подлинности, сроках годности или рекламном контенте.
- Музейные и розничные информационные точки — размещайте теги NFC рядом с экспонатами или продуктами для доставки богатого медиаконтента при постукивании.
- Медицинские и фармацевтические — Прочитайте браслеты пациента или этикетки лекарств, чтобы проверить личность и дозировку.
Для вдохновения см. Сессия WWDC 2020 от Apple по NFC и официальный код образца Core NFC .
Оптимизация производительности и лучшие практики
- Уменьшите продолжительность сеанса — установите в истинное положение, когда вам нужен только один тег. Для пакетного сканирования тщательно управляйте жизненным циклом сеанса, чтобы избежать разрядки батареи.
- Использовать выделенную очередь — Передать серийную очередь инициализатору сеанса, чтобы избежать блокировки основного потока во время обработки тега.
- Handle NFCReaderError gracefully — Всегда проверяйте ошибки, как и предоставляйте четкие сообщения пользователю.
- Тест с реальными тегами — тренажер не поддерживает NFC. Для обеспечения совместимости используйте различные физические теги (Type 2, Type 4, MIFARE).
- Избегайте циклов опроса — После обнаружения метки обработайте ее немедленно и завершите сеанс. Повторное сканирование одного и того же метки не требуется.
Устранение общих проблем
| Problem | Solution |
|---|---|
NFCNDEFReaderSession.readingAvailable returns false | Ensure 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 detected | Make 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 description | Add both NFCReaderUsageDescription and (if writing) NFCWriteAccessUsageDescription to Info.plist. |
| Background reading not triggering | Enable 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, в этой области возможность создавать бесшовные, основанные на использовании возможности никогда не были больше.