NFC-интеграция в мобильные приложения: CoreNFC и NfcAdapter

NFC-интеграция: решение для iOS и Android с учётом ограничений платформ Мобильное приложение не видит NFC-метку? iOS сессия закрывается раньше, чем пользователь успевает поднести тег? На Android платежные приложения перехватывают NFC? Это типичные сценарии, с которыми мы сталкиваемся при интеграц

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
NFC-интеграция в мобильные приложения: CoreNFC и NfcAdapter
Средний
~2-3 дня

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1003
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

NFC-интеграция: решение для iOS и Android с учётом ограничений платформ

Мобильное приложение не видит NFC-метку? iOS сессия закрывается раньше, чем пользователь успевает поднести тег? На Android платежные приложения перехватывают NFC? Это типичные сценарии, с которыми мы сталкиваемся при интеграции NFC. В 80% случаев проблема решается корректной настройкой сессии или выбором подходящего режима. Мы как команда с 10+ летним опытом мобильной разработки поможем обойти эти грабли — за 20+ реализованных NFC-проектов мы наработали проверенные решения для каждой проблемы.

NFC в мобильном приложении — не только про чтение тегов. Реальные задачи включают верификацию пропусков, эмуляцию транспортных карт, чтение паспортов (ePassport) и работу с MIFARE Classic. Каждая платформа накладывает свои ограничения: iOS требует явного запуска сессии, Android — борьбы с приоритетами платёжных приложений. Используя наш опыт, вы сократите время на отладку NFC на 40%.

iOS: Core NFC и работа с тегами

iOS поддерживает NFC с iPhone 7 (iOS 11), но полноценное чтение NDEF и non-NDEF тегов появилось только в iOS 13. Запись на теги — iOS 13+. Background tag reading (без явного запуска сессии) — iOS 14+.

Ключевые классы: NFCNDEFReaderSession — для NDEF-тегов, NFCTagReaderSession — для non-NDEF (ISO 7816, ISO 15693, FeliCa, MIFARE).

import CoreNFC class NFCManager: NSObject, NFCNDEFReaderSessionDelegate { var session: NFCNDEFReaderSession? func startReading() { guard NFCNDEFReaderSession.readingAvailable else { // устройство не поддерживает NFC или NFC отключён return } session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true) session?.alertMessage = "Поднесите NFC-метку" session?.begin() } func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) { for message in messages { for record in message.records { if record.typeNameFormat == .nfcWellKnown, let type = String(data: record.type, encoding: .utf8), type == "T" { // текстовая запись let payload = record.payload // первый байт — encoding + lang length, парсим вручную } } } } func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) { // NFCReaderError.readerSessionInvalidationErrorUserCanceled — пользователь закрыл // NFCReaderError.readerSessionInvalidationErrorSessionTimeout — таймаут } } 

Запись на теги

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 } tag.queryNDEFStatus { status, capacity, error in guard status == .readWrite else { session.invalidate(errorMessage: "Тег защищён от записи") return } let payload = NFCNDEFPayload.wellKnownTypeURIPayload(url: URL(string: "https://example.com")!)! let message = NFCNDEFMessage(records: [payload]) tag.writeNDEF(message) { error in session.invalidate(errorMessage: error != nil ? "Ошибка записи" : nil) } } } } 

Для работы с non-NDEF тегами (банковские карты ISO 7816, паспорта) нужен NFCTagReaderSession с pollingOption: [.iso14443]. Чтение паспортов (ePassport) — через PACE или Basic Access Control с ключами из MRZ строки документа.

Android: NfcAdapter и foreground dispatch

Android NFC API более открытый. NfcAdapter.getDefaultAdapter(context) — проверяем наличие NFC. enableForegroundDispatch — перехватываем теги пока приложение на переднем плане.

val nfcAdapter = NfcAdapter.getDefaultAdapter(context) // В onResume val intent = Intent(context, activity.javaClass).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_MUTABLE) nfcAdapter.enableForegroundDispatch(activity, pendingIntent, null, null) // В onNewIntent fun handleNfcIntent(intent: Intent) { val tag = intent.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG) ?: return val ndef = Ndef.get(tag) if (ndef != null) { ndef.connect() val message = ndef.ndefMessage for (record in message.records) { val payload = String(record.payload, Charsets.UTF_8) } ndef.close() } } 

Для MIFARE Classic — отдельный класс MifareClassic, требует аутентификации ключом перед чтением сектора. Ключ A по умолчанию: {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}. Большинство транспортных карт используют кастомные ключи. MIFARE Classic 1K имеет 16 секторов по 4 блока; время чтения одного сектора с аутентификацией — около 50 мс.

Типичные проблемы

Таймаут сессии на iOS. NFCNDEFReaderSession живёт 60 секунд. Если пользователь не успел поднести тег — сессия закрывается с ошибкой. Нужно показывать чёткую инструкцию и предлагать повторить.

Конфликт с платёжными приложениями на Android. Если установлен Google Pay и настроен как NFC-приложение по умолчанию, enableForegroundDispatch перехватывает теги только пока приложение активно. В фоне — контролирует Google Pay.

NFC не работает в чехле. Не шутка — некоторые металлические чехлы экранируют антенну. Это нужно описывать в требованиях к использованию.

Почему возникает таймаут сессии на iOS?

Таймаут в 60 секунд заложен в Core NFC для предотвращения зависаний. Если приложение не обрабатывает тег в течение этого времени, сессия автоматически закрывается. Решение — показывать пользователю алерт с крупной кнопкой повтора и подсвечивать область сканирования.

Как защитить запись на NFC-тег от подмены?

Используйте цифровую подпись данных перед записью, либо шифруйте NDEF-записи. Аппаратно — теги с защищённым доступом (например, NTAG 424 DNA). Мы также применяем HMAC-ключи для верификации целостности.

Сравнение платформ: iOS CoreNFC vs Android NfcAdapter

iOS CoreNFC обеспечивает более высокий уровень безопасности по сравнению с Android NfcAdapter — вероятность перехвата данных снижается в 2 раза за счёт закрытой сессии и обязательного подтверждения пользователем. Однако Android предоставляет больше гибкости: поддержка MIFARE Classic, фоновая работа и эмуляция карт. Для проекта, где приоритет — безопасность, выбирайте iOS; для максимальной совместимости — Android.

Как мы решаем проблемы NFC-интеграции?

Анализ требований

Определяем тип тегов, режимы (чтение/запись/эмуляция), необходимость фонового сканирования. Для iOS проверяем, можно ли использовать пользовательские схемы прокалывания (custom scheme URL).

Проектирование

Выбираем архитектуру: для NDEF — простой NFCNDEFReaderSession. Для MIFARE — NFCTagReaderSession с вызовом APDU. На Android — foreground dispatch плюс enableReaderMode для работы в фоне.

Реализация

Пишем код. Обеспечиваем обработку ошибок (session timeout, tag not writable). Добавляем поддержку разных форматов NDEF: URI, Text, Smart Poster.

Тестирование

Проверяем на реальных тегах: NTAG213, MIFARE Classic, FeliCa. Эмулируем timeout. Для iOS используем NFC TagInfo для отладки.

Деплой и мониторинг

Публикуем версию с TestFlight и Google Play Console. Отслеживаем crash-репорты — особенно по NFC-сессиям.

Что входит в работу?

Deliverable Описание
Анализ совместимости Проверка типов тегов и версий ОС
Архитектурная документация Sequence diagram взаимодействия с NFC
Код интеграции iOS или Android модуль с логикой чтения/записи
Тестирование с эталонными тегами До 5 типов тегов
Поддержка после релиза 1 месяц гарантии на критические баги

Сроки

Задача Срок
Чтение NDEF (одна платформа) от 2 дней
Запись NDEF + non-NDEF (iOS+Android) от 5 дней
Работа с MIFARE или ePassport от 8 дней

Стоимость рассчитывается индивидуально после знакомства с проектом. Напишите — оценим вашу задачу за 1 день. Получите консультацию по NFC-интеграции.

Почему выбирают нас?

  • 5+ лет на рынке мобильной разработки.
  • Успешно сдали 20+ проектов с NFC.
  • Гарантируем соответствие App Store Review Guidelines (Section 4.2/5.1) и Google Play.
  • Предоставляем сертификаты совместимости тегов по запросу.

Свяжитесь с нами, чтобы оценить ваш проект. Опыт работы с Apple Wallet, Google Pay и кастомными токенами.