簡體   English   中英

CoreNFC - NFCNDEFReaderSession session 在 iPhone 8 上失效后無法啟動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM