Проблемы с считыванием информации 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()
}
}
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