IOS 11 Core NFC - любой пример кода?

Я только что установил первую бета-версию iOS 11 на iPhone 7 и заинтересован в попытке NFC. В настройках ничего нет. Мне интересно, есть ли там какой-нибудь образец кода, показывающий, как читать тег. Может ли кто-нибудь показать, как использовать Core NFC SDK, в фрагменте кода?

Ответ 1

На сайте Apple Developer создайте новый идентификатор приложения и убедитесь, что NFC Tag Reading включено.

Dev portal capabilities

Добавьте следующие строки в ваш файл .plist:

<key>NFCReaderUsageDescription</key>
<string>NFC Tag!</string>

и это в файл прав:

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

Это должно выглядеть примерно так в соответствующих файлах:

enter image description here

Также Core NFC может быть включен через вкладку Возможности в XCode.

enter image description here

Objective-C

Импорт CoreNFC

#import <CoreNFC/CoreNFC.h>

и установите делегата:

@interface YourViewController : UIViewController <NFCNDEFReaderSessionDelegate>

В viewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NFCNDEFReaderSession *session = [[NFCNDEFReaderSession alloc] initWithDelegate:self queue:dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT) invalidateAfterFirstRead:NO];
    [session beginSession];
}

В обратном вызове делегата:

- (void) readerSession:(nonnull NFCNDEFReaderSession *)session didDetectNDEFs:(nonnull NSArray<NFCNDEFMessage *> *)messages {

    for (NFCNDEFMessage *message in messages) {
        for (NFCNDEFPayload *payload in message.records) {
            NSLog(@"Payload data:%@",payload.payload);
        }
    }        
}

Вы также должны добавить didInvalidateWithError вызов делегата didInvalidateWithError иначе вы не будете соответствовать протоколу:

- (void)readerSession:(nonnull NFCNDEFReaderSession *)session didInvalidateWithError:(nonnull NSError *)error {

}

Вы можете остановить читателя с помощью:

[session invalidateSession];

Свифт 3/4

Импортировать CoreNFC

import CoreNFC

и установите делегата:

class YourViewController: UIViewController, NFCNDEFReaderSessionDelegate

В viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()

        let session = NFCNDEFReaderSession(delegate: self,
                      queue: DispatchQueue(label: "queueName", attributes: .concurrent), invalidateAfterFirstRead: false)  
        session?.begin()
    }

В обратном вызове делегата:

func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
  for message in messages {
    for record in message.records {
      print(record.payload)
    }
  }
}

Вы можете остановить читателя с помощью:

session.invalidateSession

использование

После запуска представления вы должны сразу увидеть диалог чтения iOS NFC следующим образом:

iOS NFC reader dialog

Как только появится это диалоговое окно, у вас есть около секунды, чтобы поместить iPhone рядом с тегом NFC, который вы хотите прочитать. В противном случае поле деактивируется (похоже, это ошибка Apple end). Мне часто нужно было отменить и повторить попытку, чтобы получить согласованные показания. Подробнее здесь.

Ответ 2

Чтобы устранить эту проблему, вы можете добавить ключ com.apple.developer.nfc.readersession.formats в файл прав. Ключ должен быть связан с массивом включенных типов NFS. Например, вы можете попробовать следующее:

    <array>
        <string>NDEF</string>
    </array>'''

It worked for me.

<img src="https://i.stack.imgur.com/I9wHX.png">

Ответ 3

Обновлен для второй бета-версии Xcode.

Добавьте возможности NFC в ваше приложение из Центра разработчиков. Идентификаторы → Идентификаторы приложений → включить "Чтение тегов NFC".

Если ваш проект не имеет файла права, позвольте Xcode создать его для вас, просто активировав, а затем отключив любую возможность из Xcode → Project Targets → Capabilities. В навигаторе проектов вы найдете новый файл [AppName].entitlements. Щелкните этот файл правой кнопкой мыши и выберите "Открыть как → Исходный код". Введите следующую запись вручную между <dict></dict>:

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

Как только Xcode 9 позволяет включить чтение тегов NFC из выбора возможностей, этот шаг становится устаревшим, потому что все, что вам нужно сделать, - это включить его. Текущая (первая) бета-версия не поддерживает это.

Вам также необходимо ввести описание использования для предупреждения о конфиденциальности iOS, который покажет пользователю. (На данный момент (бета 1) это предупреждение будет отображаться, когда устройство будет готово к сканированию, и отобразит собственный системный диалог, который будет содержать это сообщение. Однако это, похоже, не используется.) Откройте свой целевой Info.plist и начните вводить текст "Конфиденциальность", и вы можете прокрутить вниз до "Конфиденциальность - описание использования NFC", чтобы выбрать его, нажав на возврат. Введите значащее объяснение для пользователя в правой колонке.

Теперь вы должны иметь возможность импортировать CoreNFC, в Swift:

import CoreNFC

Затем перейдите к Apple documentation.

Важная. Если компилятор возвращает ошибку с No such module 'CoreNFC', проверьте, было ли вы выбрано фактическое устройство iOS 11 для сборки, а не симулятор. Это также должен быть iPhone 7 или 7 плюс. Это может измениться в будущей версии, но тестирование NFC будет только полностью работать с реальным оборудованием. (базовый Bluetooth, где вы можете запускать на Simulator, но не тестировать реальные возможности.) Beta 2 больше не имеет этой проблемы. Однако фактическое оборудование в виде iPhone 7/p все еще требуется для фактического тестирования.

Ответ 4

Чтобы обогатить предыдущие ответы, важно помнить об этих особенностях класса NFCNDEFReaderSession:

  • Сессия чтения для обработки тегов NFC Data Exchange Format (NDEF). Этот сеанс требует права "com.apple.developer.nfc.readersession.formats" в вашем процессе. Кроме того, ваше приложение Info.plist должно содержать непустую строку описания использования.
  • Считыватель NDEF автоматически сканирует и обнаруживает NFC Forum теги, которые содержат действительное сообщение NDEF. NFC Forum Тип тега от 1 до 5 то есть формат NDEF поддерживается. Будет представлен пользовательский интерфейс модальной системы один раз -beginSession вызывается для информирования о начале сеанса; Лист пользовательского интерфейса автоматически отклоняется, когда сеанс недействителен либо пользователем, либо путем вызова -invalidateSession.
  • Открытый сеанс имеет ограничение 60 секунд после вызова -beginSession; -readerSession:didInvalidateWithError: вернет ошибку NFCReaderSessionInvalidationErrorSessionTimeout, когда будет достигнут срок.
  • В системе допускается только 1 активный сеанс чтения; -readerSession:didInvalidateWithError: вернет NFCReaderSessionInvalidationErrorSystemIsBusy, когда новый сеанс чтения инициируется -beginSession, когда есть активный сеанс чтения.
  • -readerSession:didInvalidateWithError: вернет NFCReaderSessionInvalidationErrorUserCanceled, когда пользователь нажимает кнопку "Готово" в пользовательском интерфейсе.
  • -readerSession:didInvalidateWithError: вернет NFCReaderSessionInvalidationErrorSessionTerminatedUnexpectedly , когда клиентское приложение войдет в фоновое состояние. -readerSession:didInvalidateWithError: вернет NFCReaderErrorUnsupportedFeature, когда
    • Функция режима чтения недоступна на аппаратном уровне.
    • Клиентское приложение не имеет необходимых прав.

Ответ 5

Вам нужно убедиться, что описание использования установлено, а также добавить возможность приложения в Центр разработчиков Apple. У меня есть учебник, основанный на моем опыте (Swift 4). Он доступен здесь: Core NFC Tutorial

Ответ 6

Я добавил Core NFC в проект, используя ресурсы в этих ответах. Еще одна вещь, которая не была отмечена, заключалась в том, что даже если вы добавите возможность вручную через права, Xcode, похоже, не смотрит файл, если у вас нет возможности включить. Вероятно, это связано с тем, что Xcode 9 Beta 1 не имеет Core NFC в качестве переключателя возможностей для множества примеров проектов. Поэтому просто обязательно включите хотя бы одну возможность, если вы все еще видите проблемы! Я сразу увидел неожиданную ошибку завершения, пока не сделал это.

Я бы оставил это как комментарий, поскольку он принадлежит, но пока не имеет достаточной репутации для этого. Понятно, что это было достаточно важно, чтобы отметить.

Ответ 7

мои два цента:

1) в xcode 9.0 (beta 4 9M189t), если вы уже добавили возможности, нет необходимости вручную добавлять:

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

выполняется автоматически

2) нет сбоя, если вы не используете iPhone 7 или находитесь в симуляторе:

Вы будете вызваны:

func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
        print(error.localizedDescription)
    }

он покажет: "Функция не поддерживается"

3) не пропустите:

self.nfcSession?.begin() // will trigger callback

так:

    final private func setup(){
    self.nfcSession = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
    self.nfcSession?.alertMessage = "Put your NFC TAG over iPhone.."
    self.nfcSession?.begin() // will trigger callback

}

4), если пользователь отменяет, вы получите:

"Сессия отменена с помощью отмены пользователя"

в обратном вызове didInvalidateWithError.