Проблемы с считыванием информации eID в NFC с использованием iOS13 - PullRequest
0 голосов
/ 12 июня 2019

Исходя из аналогичного вопроса ( Не удается прочитать чип 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()
    }
}


1 Ответ

1 голос
/ 13 июня 2019

Ваша 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

...