[英]CoreNFC - NFCNDEFReaderSession session couldn't start after invalidation on iPhone 8
该问题仅在没有背景 NFC 读取的 iPhone 8 等旧 NFC 设备上重现,但在 iPhone 12、11、X 上一切正常。单击取消(使会话无效)后 - 无法再次启动 NFC session . 只有在强制关闭应用程序后才能重新启动。 这里是打开session的代码(按键扫描)
session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
session?.alertMessage = "Hold your iPhone near the item to scan tag."
session?.begin()
委托方法代码 NFCNDEFReaderSessionDelegate
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
guard let ndefMessage = messages.first,
let record = ndefMessage.records.first,
record.typeNameFormat == .absoluteURI || record.typeNameFormat == .nfcWellKnown,
let payloadText = String(data: record.payload, encoding: .utf8) else {
return
}
print("scanned NFC info: \(payloadText)")
self.session = nil
}
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
if let readerError = error as? NFCReaderError {
if (readerError.code != .readerSessionInvalidationErrorFirstNDEFTagRead)
&& (readerError.code != .readerSessionInvalidationErrorUserCanceled) {
let alertController = UIAlertController(
title: "Session is expired.",
message: "Please, try again.",//error.localizedDescription,
preferredStyle: .alert
)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
DispatchQueue.main.async {
self.present(alertController, animated: true, completion: nil)
}
}
}
self.session = nil
}
您将不得不再次重新启动 session。
@IBAction func beingScanning(){
guard !session?.isReady else {
return
}
// invalidateAfterFirstRead = false
session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false)
session?.alertMessage = "Hold your iPhone near the item to scan tag."
session?.begin()
}
也使用invalidateAfterFirstRead
false 而不是 true。 成功阅读后,您可以将其无效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.