Core NFC в Xamarin.iOS

Чтение тегов near Field Communication (NFC) с помощью iOS 11

CoreNFC — это новая платформа в iOS 11, которая предоставляет доступ к радио поблизости (NFC) для чтения тегов из приложений. CoreNFC работает на i Телефон 7, i Телефон 7 Plus, i Телефон 8, i Телефон 8 Plus, i Телефон X, i Телефон XS и i Телефон 11 моделей (в то время как i Телефон 6 и i Телефон 6 Плюс модели NFC, они не поддерживают функции оплаты NFC. CoreNFC).

Средство чтения тегов NFC на устройствах iOS поддерживает все типы тегов NFC от 1 до 5, содержащие сведения о формате ОБМЕНА данными NFC (NDEF).

Существуют некоторые ограничения, которые следует учитывать:

  • CoreNFC поддерживает только чтение тегов (не написание или форматирование).
  • Сканирование тегов должно быть инициировано пользователем и истекает через 60 секунд.
  • Приложения должны быть видимы на переднем плане для сканирования.
  • CoreNFC можно тестировать только на реальных устройствах (а не на симуляторе).

На этой странице описывается конфигурация, необходимая для использования CoreNFC, и показано, как использовать API с помощью примера кода NFCTagReader.

Настройка

Чтобы включить CoreNFC, необходимо настроить три элемента в проекте:

  • Ключ конфиденциальности Info.plist.
  • Запись entitlements.plist.
  • Профиль подготовки с возможностью чтения тегов NFC.

Info.plist

Добавьте ключ конфиденциальности и текст NFCReaderUsageDescription, который отображается пользователю во время сканирования. Используйте сообщение, подходящее для приложения (например, объясните цель сканирования):

<key>NFCReaderUsageDescription</key>
<string>NFC tag to read NDEF messages into the application</string>

Entitlements.plist

Приложение должно запросить возможность чтения тега near Field Communications с помощью следующей пары "ключ-значение" в файле "Праваs.plist":

<key>com.apple.developer.nfc.readersession.formats</key>
<array>
  <string>NDEF</string>
</array>

Профиль подготовки

Создайте идентификатор приложения и убедитесь, что служба чтения тегов NFC задается:

Developer Portal New App ID page with NFC Tag Reading selected

Затем необходимо создать новый профиль подготовки для этого идентификатора приложения, а затем скачать и установить его на компьютере mac для разработки.

Чтение тега

После настройки проекта добавьте using CoreNFC; в начало файла и выполните следующие три действия, чтобы реализовать функцию чтения тегов NFC:

1. Реализация INFCNdefReaderSessionDelegate

Интерфейс имеет два метода реализации:

  • DidDetect — вызывается, когда тег успешно считывается.
  • DidInvalidate — вызывается при возникновении ошибки или достижении 60-секундного тайм-аута.

DidDetect

В примере кода каждое сканированное сообщение добавляется в представление таблицы:

public void DidDetect(NFCNdefReaderSession session, NFCNdefMessage[] messages)
{
    foreach (NFCNdefMessage msg in messages)
    {  // adds the messages to a list view
        DetectedMessages.Add(msg);
    }
    DispatchQueue.MainQueue.DispatchAsync(() =>
    {
        this.TableView.ReloadData();
    });
}

Этот метод может вызываться несколько раз (и массив сообщений может передаваться), если сеанс разрешает несколько операций чтения тегов. Этот параметр устанавливается с помощью третьего Start параметра метода (описано на шаге 2).

DidInvalidate

Недопустимость может произойти по ряду причин:

  • При проверке произошла ошибка.
  • Приложение перестало находиться на переднем плане.
  • Пользователь решил отменить проверку.
  • Проверка была отменена приложением.

В приведенном ниже коде показано, как обрабатывать ошибку:

public void DidInvalidate(NFCNdefReaderSession session, NSError error)
{
    var readerError = (NFCReaderError)(long)error.Code;
    if (readerError != NFCReaderError.ReaderSessionInvalidationErrorFirstNDEFTagRead &&
        readerError != NFCReaderError.ReaderSessionInvalidationErrorUserCanceled)
    {
      // some error handling
    }
}

После отмены сеанса необходимо создать новый объект сеанса для повторного сканирования.

2. Запуск NFCNdefReaderSession

Сканирование должно начинаться с запроса пользователя, например нажатия кнопки. Следующий код создает и запускает сеанс сканирования:

Session = new NFCNdefReaderSession(this, null, true);
Session?.BeginSession();

Параметры конструктора NFCNdefReaderSession приведены следующим образом:

  • delegate — реализация INFCNdefReaderSessionDelegate. В примере кода делегат реализуется в контроллере представления таблиц, поэтому this используется в качестве параметра делегата.
  • queue — очередь, в которую обрабатываются обратные вызовы. nullВ этом случае можно использовать DispatchQueue.MainQueue при обновлении элементов управления пользовательским интерфейсом (как показано в примере).
  • invalidateAfterFirstRead — Когда trueсканирование останавливается после первой успешной проверки; при false сканировании будет продолжаться и несколько результатов возвращаются до тех пор, пока не будет отменена проверка или достигнуто 60 секундное время ожидания.

3. Отмена сеанса сканирования

Пользователь может отменить сеанс сканирования с помощью кнопки, предоставленной системой, в пользовательском интерфейсе:

Cancel button while scanning

Приложение может программно отменить проверку, вызвав InvalidateSession метод:

Session.InvalidateSession();

В обоих случаях метод делегата DidInvalidate будет вызываться.

Итоги

CoreNFC позволяет приложению считывать данные из тегов NFC. Он поддерживает чтение различных форматов тегов (NDEF типов 1–5), но не поддерживает запись или форматирование.