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.
Настройка
Чтобы включить 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 задается:
Затем необходимо создать новый профиль подготовки для этого идентификатора приложения, а затем скачать и установить его на компьютере 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. Отмена сеанса сканирования
Пользователь может отменить сеанс сканирования с помощью кнопки, предоставленной системой, в пользовательском интерфейсе:
Приложение может программно отменить проверку, вызвав InvalidateSession
метод:
Session.InvalidateSession();
В обоих случаях метод делегата DidInvalidate
будет вызываться.
Итоги
CoreNFC позволяет приложению считывать данные из тегов NFC. Он поддерживает чтение различных форматов тегов (NDEF типов 1–5), но не поддерживает запись или форматирование.