使用 iOS13 使用 NFC 读取 eID 信息时遇到问题
Trouble reading eID information with NFC 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()
}
}
我觉得你的 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 标签那样直接。
ICAO Doc9303 Appendix D to Part 11 中提供的工作示例对理解需要实施的内容有很大帮助。
就我而言,我几乎在 swift 中完成了它的实施,一旦我的应用程序在应用程序商店上架,我将根据 MIT 许可证发布源代码。
为此,我包含了一些取自此处的 C/C++ 代码:https://github.com/UBIC-repo/core/tree/master/PassportReader/Reader
为了进行 3DES encryption/decryption 和校验和计算,您可能需要使用一些到 C 的桥接。
编辑:有人已经在此处发布了有效的源代码:https://github.com/AndyQ/NFCPassportReader
来自一个类似的问题 (
任何建议或更多信息?有人设法让这个工作了吗?非常感谢!
编辑:添加了当前工作代码以改进和澄清问题。
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 标签那样直接。 ICAO Doc9303 Appendix D to Part 11 中提供的工作示例对理解需要实施的内容有很大帮助。
就我而言,我几乎在 swift 中完成了它的实施,一旦我的应用程序在应用程序商店上架,我将根据 MIT 许可证发布源代码。 为此,我包含了一些取自此处的 C/C++ 代码:https://github.com/UBIC-repo/core/tree/master/PassportReader/Reader
为了进行 3DES encryption/decryption 和校验和计算,您可能需要使用一些到 C 的桥接。
编辑:有人已经在此处发布了有效的源代码:https://github.com/AndyQ/NFCPassportReader