簡體   English   中英

使用iOS13使用NFC讀取eID信息時遇到問題

[英]Trouble reading eID information with NFC using iOS13

來自一個類似的問題( 無法使用iOS13讀取ePassport的NFC芯片 ),我也試圖按照與另一個問題相同的方法,使用iOS13讀取eID上的信息,但是我似乎無法獲得后續步驟掃描文檔即可工作。 (例如使用MRZ代碼創建BAC並相應地讀取數據)

有什么建議或更多信息嗎? 有人設法使它工作了嗎? 非常感謝!

編輯 :添加了當前的工作代碼,以改善和闡明問題。

import UIKit
import CoreNFC

class ViewController: UIViewController, NFCTagReaderSessionDelegate {

    var readerSession: NFCTagReaderSession?

    func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) {

    }

    func tagReaderSession(_ session: NFCTagReaderSession, didInvalidateWithError error: Error) {
        print(error)
    }

    func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
        var ndefTag: NFCNDEFTag

        switch tags.first! {
            case let .iso7816(tag):
                ndefTag = tag
            default:
                session.invalidate(errorMessage: "Card not valid")
                return
        }

        session.connect(to: tags.first!) { (error: Error?) in
            if error != nil {
                session.invalidate(errorMessage: "Connection error. Please try again.")
                return
            }

            let card: NFCISO7816Tag
            card = ndefTag as! NFCISO7816Tag

            print(card)
        }
    }

    @IBAction func nfcButton(_ sender: Any) {
        guard NFCNDEFReaderSession.readingAvailable else {
            let alertController = UIAlertController(
                title: "Scanning Not Supported",
                message: "This device doesn't support scanning your identity document.",
                preferredStyle: .alert
            )

            alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alertController, animated: true, completion: nil)
            return
        }

        readerSession = NFCTagReaderSession(pollingOption: [.iso14443], delegate: self, queue: nil)
        readerSession?.alertMessage = "Place the device on the identity document."
        readerSession?.begin()
    }
}


您的func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag])實現對我來說是錯誤的。 您正在將NFCISO7816Tag轉換為NFCNDEFTag,然后再轉換回NFCISO7816Tag。 實現應如下所示:

func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {

    let tag = tags.first!

    nfcTagReaderSession?.connect(to: tag) { (error: Error?) in
            if case let .iso7816(iso7816Tag) = tag {
                // do your magic with iso7816Tag here
             }
     }
}

讀取ePassport / eID NFC芯片的內容並不像讀取一個簡單的NDEF標簽那樣費勁。 國際民航組織Doc9303號文件第11部分附錄D中提供的工作示例對理解需要實施的內容有很大幫助。

就我而言,我幾乎很快就實現了它,一旦我的應用程序在應用商店中,我將以MIT許可證發布源代碼。 為此,我包含了一些從此處獲取的C / C ++代碼: https : //github.com/UBIC-repo/core/tree/master/PassportReader/Reader

您可能需要對C使用一些橋接,以便進行3DES加密/解密和校驗和計算。

編輯:有人已經在這里發布了工作源代碼: https : //github.com/AndyQ/NFCPassportReader

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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