Я только что обновился до iOS 16, и вдруг тот же код, который я использовал в iOS 15, теперь читается ndefMessage как nil в обратном вызове didDetect. Я не могу найти ничего в Интернете о том, что в iOS 16 может вызвать это, кто-нибудь видел что-нибудь подобное?
Когда я сканирую тот же тег на Android или использую приложение NFC Tools на iOS, я могу нормально прочитать тег NDEF. Похоже, обновление затронуло только мой код...
ОБНОВЛЕНИЕ 1: я поместил тот же код на свое устройство iOS 15.6, и он отлично работает. Мне кажется, что это баг iOS 16.
Вот что у меня есть:
func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
print("did detect")
let str: String = nfcWriteContent
if (tags.count > 1) {
let retryInterval = DispatchTimeInterval.milliseconds(500)
session.alertMessage = "too_many_nfc_detected".localized()
DispatchQueue.global().asyncAfter(deadline: .now() + retryInterval, execute: {
session.restartPolling()
})
return
}
let tag = tags.first!
print("reading...")
tag.readNDEF(completionHandler: {(ndefMessage: NFCNDEFMessage?, error: Error?) in
var res = ""
if (ndefMessage == nil) {
// EVERY NFC SCAN ALWAYS FALLS IN HERE NOW
// WHEN SCANNING THE SAME TAG ON ANDROID, NDEF CONTENT IS PROPERLY RETURNED
print("empty tag")
} else {
print (ndefMessage!.records.count)
for payload in ndefMessage!.records {
if (payload.payload.count == 0) {
continue
}
res += (String.init(data: payload.payload.advanced(by: 1), encoding: .utf8) ?? "Format not supported")
}
}
session.alertMessage = "tag_successfully_read".localized()
session.invalidate()
print("read \(res)")
})
}
@ Эндрю Я использую тег NFC Forum Type 2, нет, я еще не пробовал теги другого типа (на данный момент у меня нет других доступных). Это очень странно, потому что я весь день использовал эти теги типа 2 с этим кодом, но я решил обновиться до iOS 16 раньше, и теперь ndef всегда читается как ноль. Однако запись NFC работает нормально...
@Andrew, проверь мое редактирование - похоже, это ошибка iOS 16.
Привет @sparkhead95, я вижу то же самое с NTAG 213. Я обнаружил это, потому что некоторые из моих клиентов жалуются. tag.readNDEF возвращает «Тег не подключен» как ошибку. Однако NTAG 216 у меня работает нормально...
Я попробовал асинхронный API ожидания прошлой ночью, но у него также есть ошибка...





Я получил отзыв от инженера Apple. Пример проекта отлично работает на iOS 16. Вы упускаете из виду, что не подключены к тегу:
try await ndefReaderSession?.connect(to: tag)
let message = try await tag.readNDEF()
or
ndefReaderSession?.connect(to: tag) { error in
//call tag.readNDEF here
}
Обратите внимание: у меня был такой файл прав при развертывании в TestFlight, и загрузка не удалась, предупредив меня, что права NFC неверны. Мне пришлось удалить NDEF, чтобы исправить это. Возможно, это связано...
Хорошо, ты прав. Это был неправильный ответ @sparkhead95. Я тоже видел предупреждение. Я нашел ошибку сейчас и адаптировал ответ.
Я делаю то же самое в своем коде в своем вопросе - я подключаюсь в начале, а затем вызываю tag.readNDEF. Или я неправильно понял ваш ответ?
Где? Я не вижу вызова подключения в вашем коде @sparkhead95
О, ты прав! У меня также есть некоторый код записи NFC (который действительно подключается), и я случайно посмотрел на него. Спасибо за вашу помощь! Интересно, что мне не нужно было подключаться в iOS 15.
Какой-то конкретный тип тега. Пробовали ли вы какой-либо другой тип тега?