Проблемы со чтением информации eID с помощью NFC при использовании iOS13

Исходя из аналогичного вопроса (Не удается прочитать чип NFC электронного паспорта с помощью iOS13), я также пытаюсь прочитать информацию о eID используя iOS13, следуя тому же подходу, что и в другом вопросе, но я не могу понять шаги после сканирования документа для работы. (например, использование кода 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()
    }
}



person Thomas    schedule 12.06.2019    source источник
comment
О каком eID вы говорите? Голландский? В заголовке вопроса вы говорите, что у вас проблемы с чтением электронного паспорта, а в описании вы говорите о eID, это сбивает с толку.   -  person Jan Moritz    schedule 13.06.2019
comment
Я говорю о голландском eID, я изменил название, чтобы избежать путаницы, спасибо!   -  person Thomas    schedule 13.06.2019
comment
tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) вызывается?   -  person Jan Moritz    schedule 13.06.2019
comment
Я добавил свой код, чтобы прояснить свой вопрос и показать свой прогресс. tagReaderSession вызывается, и я преобразовал результат в NFCISO7816Tag.   -  person Thomas    schedule 13.06.2019


Ответы (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
             }
     }
}

Чтение содержимого NFC-чипа ePassport/eID не так сложно, как чтение простого тега NDEF. Рабочий пример приведен в добавлении D к части 11 документа Doc9303 от ИКАО. очень помогает понять, что нужно реализовать.

Со своей стороны, я почти закончил его реализацию в кратчайшие сроки и опубликую исходный код под лицензией MIT, как только мое приложение появится в магазине приложений. Для этого я включил код C/C++, взятый отсюда: https://github.com/UBIC-repo/core/tree/master/PassportReader/Reader

Вам, вероятно, потребуется использовать некоторый мост к C, чтобы выполнить шифрование/дешифрование 3DES и вычисления контрольной суммы.

РЕДАКТИРОВАТЬ: кто-то уже разместил рабочий исходный код здесь: https://github.com/AndyQ/NFCPassportReader

person Jan Moritz    schedule 13.06.2019