使用iOS13使用NFC读取eID信息时遇到问题

时间:2019-06-12 16:34:48

标签: ios swift nfc ios13

来自一个类似的问题(Cannot read the NFC chip of the ePassport using iOS13,我也试图按照与其他问题相同的方法,使用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()
    }
}


1 个答案:

答案 0 :(得分:1)

您的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号文件的Appendix D to Part 11中提供的工作示例对于理解需要实施的内容很有帮助。

就我而言,我几乎很快就实现了它,一旦我的应用程序在应用商店中,它将以MIT许可证发布源代码。 为此,我包含了一些从此处获取的C / C ++代码:https://github.com/UBIC-repo/core/tree/master/PassportReader/Reader

您可能需要对C使用一些桥接,以便进行3DES加密/解密和校验和计算。

编辑:有人已经在此处发布了有效的源代码:https://github.com/AndyQ/NFCPassportReader