Я только что установил первую бета-версию iOS 11 на iPhone 7 и заинтересован в попытке NFC. В настройках ничего нет. Мне интересно, есть ли там какой-нибудь образец кода, показывающий, как читать тег. Может ли кто-нибудь показать, как использовать Core NFC SDK, в фрагменте кода?
IOS 11 Core NFC - любой пример кода?
Ответ 1
На сайте Apple Developer создайте новый идентификатор приложения и убедитесь, что NFC Tag Reading
включено.
Добавьте следующие строки в ваш файл .plist:
<key>NFCReaderUsageDescription</key>
<string>NFC Tag!</string>
и это в файл прав:
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
</array>
Это должно выглядеть примерно так в соответствующих файлах:
Также Core NFC может быть включен через вкладку Возможности в XCode.
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 следующим образом:
Как только появится это диалоговое окно, у вас есть около секунды, чтобы поместить 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.
Важная. Если компилятор возвращает ошибку с Beta 2 больше не имеет этой проблемы. Однако фактическое оборудование в виде iPhone 7/p все еще требуется для фактического тестирования.No such module 'CoreNFC'
, проверьте, было ли вы выбрано фактическое устройство iOS 11 для сборки, а не симулятор. Это также должен быть iPhone 7 или 7 плюс. Это может измениться в будущей версии, но тестирование NFC будет только полностью работать с реальным оборудованием. (базовый Bluetooth, где вы можете запускать на Simulator, но не тестировать реальные возможности.)
Ответ 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.