Skip to content

Tích hợp iOS SDK ​

Hướng dẫn tích hợp CICReader iOS SDK, phiên bản 1.0.7. Viết bằng Swift; entry point là CESNfc.

Yêu cầu build ​

Thông tinMô tả
Xcode16.0+
Phiên bản iOS mục tiêu13+

Tích hợp ​

Thêm SDK framework vào target của bạn, sau đó thêm các pod sau:

ruby
pod 'OpenSSL-Universal', '~> 1.1.180'
pod 'PromisesSwift', '~> 2.4.0'

Bật capability Near Field Communication Tag Reading, sau đó khai báo usage description và các application identifier ISO7816:

xml
<key>NFCReaderUsageDescription</key>
<string>We would like to use NFC to scan NID chip</string>

<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
    <string>A0000002471001</string>
    <string>A0000002472001</string>
    <string>00000000000000</string>
</array>

WARNING

Thiếu bất kỳ identifier nào trong ba ISO7816 identifier ở trên sẽ khiến việc đọc chip âm thầm thất bại trên bản build production, dù vẫn hoạt động ở bản debug. Xem Kiểm tra cấu hình IPA bên dưới.

Khởi tạo ​

swift
let nfcConfig = CESNfcConfig(baseUrl: "<BASE_URL>",
                             enableCheckNfcData: true,
                             readTimeout: 60000,
                             writeTimeout: 60000)

let nfcReader = CESNfc(nfcConfig)
nfcReader.delegate = self               // tùy chọn
nfcReader.displayMessageDelegate = self // tùy chọn

Tham số:

Tham sốKiểuBắt buộcMặc địnhMô tả
baseUrlstringCó—Base URL cho các lệnh gọi API.
enableCheckNfcDataboolKhôngtrueXác minh dữ liệu NFC với Cake RAR.
readTimeoutintKhông60000Timeout đọc API tính bằng mili-giây.
writeTimeoutintKhông60000Timeout ghi API tính bằng mili-giây.
cacheScanStrategyenumKhông.NO_CACHEXem Tổng quan Mobile SDK § Cache khi server lỗi.
sessionDelayConfigCESSessionDelayConfigKhông—Thời gian chờ thử lại theo từng thiết bị. Xem bên dưới.

Header tùy chỉnh ​

swift
extension DemoViewController: CESNfcDelegate {
    func provideHeaders() -> [String: String?] {
        return [
            "custom_header1": "value1",
            "custom_header2": "value2"
        ]
    }
}

Thông báo hiển thị tùy chỉnh ​

Mỗi phương thức đều tùy chọn — chỉ override những thông báo bạn muốn thay đổi.

swift
extension ViewController: CESNfcDisplayMessageDelegate {
    func presentRequestPresentPassport() -> String { }
    func presentAuthenticatingWithPassport(progress: Int) -> String { }
    func presentReadingDataGroupProgress(dataGroup: DataGroupId, progress: Int) -> String { }
    func presentError(error: CESNfcError) -> String { }
    func presentSuccessfulRead() -> String { }
    func presentStartVerifyData() -> String { }
    func presentVerifyDataDone() -> String { }
}

Đọc chip ​

Dùng MRZ — số CCCD 9 chữ số, ngày sinh, ngày hết hạn ​

Ném lỗi InvalidFullMRZKey khi bất kỳ đầu vào nào sai.

swift
nfcReader.readNfc(
        idCard: "xxxxxxxxx",
        dayOfBirth: "901212",
        expireDate: "301212",
        accessToken: "<ACCESS_TOKEN>",
        refId: "ref_00000001")
    .then { result in
        // result
    }.catch { err in
        // handle error
    }
Tham sốKiểuBắt buộcMặc địnhMô tả
idCardstringCó—9 chữ số cuối của số CCCD.
dayOfBirthstringCó—Ngày sinh, định dạng yyMMdd.
expireDatestringCó—Ngày hết hạn của thẻ, định dạng yyMMdd.
accessTokenstringCó—Access token của request.
refIdstringCó—Reference ID của giao dịch cần xác minh.

Dùng CAN — số CCCD 12 chữ số ​

Ném lỗi InvalidCANKey khi số sai.

swift
nfcReader.readNfc(
        docId: "001xxxxxxxxx",
        accessToken: "<ACCESS_TOKEN>",
        refId: "ref_00000001")
    .then { result in
        // result
    }.catch { err in
        // handle error
    }
Tham sốKiểuBắt buộcMặc địnhMô tả
docIdstringCó—Số CCCD đầy đủ 12 chữ số.
accessTokenstringCó—Access token của request.
refIdstringCó—Reference ID của giao dịch cần xác minh.

Kết quả ​

CESNfcResult mang theo các data group thô, cùng với các trường thông tin công dân đã phân tích khi enableCheckNfcData là true.

Dữ liệu chip ​

TrườngKiểuMô tả
comstringThông tin phiên bản Unicode và danh sách các data group hiện có. Base64.
sodstringDữ liệu SOD từ lần quét NFC. Base64.
dg1stringThông tin cơ bản của cá nhân — thông tin MRZ. Base64.
dg2stringẢnh khuôn mặt công dân đã mã hóa. Base64.
dg13stringThông tin liên quan đến công dân. Base64.
dg14stringDùng cho cơ chế truy cập EAC. Base64.
dg15stringPublic key, dùng cho Passive Authentication. Base64.
cloneStatusCESNfcVerdictClone status của thẻ. Xem Tổng quan Mobile SDK § Clone status.
imageDataString?Ảnh khuôn mặt được tính toán từ dữ liệu dg2.

Trường thông tin công dân — lấy từ API ​

TrườngKiểuMô tả
idCardNostringSố định danh của công dân.
oldIdCardNumberstringSố định danh cũ.
fullNamestringHọ và tên đầy đủ.
dateOfBirthstringNgày sinh.
dateOfExpirystringNgày hết hạn của thẻ.
genderstringGiới tính.
nationalitystringQuốc tịch.
ethnicstringDân tộc.
religionstringTôn giáo.
placeOfOriginstringQuê quán.
residenceAddressstringNơi thường trú.
personalSpecificIdentificationstringĐặc điểm nhận dạng cá nhân.
dateOfIssuancestringNgày cấp thẻ.
fatherNamestringHọ tên cha.
motherNamestringHọ tên mẹ.
spouseNamestringHọ tên vợ/chồng.
faceImagestringẢnh khuôn mặt. Base64.
isVerifiedboolThẻ có được RAR xác minh hay không.
verificationKeystringVerification key — truyền giá trị này vào Xác minh NFC.
requestIdstringRequest ID của lần xác thực.

iOS dùng idCardNo và residenceAddress, trong khi Flutter dùng citizenIdentify và placeOfResidence — cùng giá trị, khác tên gọi.

Event listener ​

swift
// nfcReader.eventDelegate = self

public func nfcScanWillStart() -> Void { }
public func nfcScanDidEnd(isScanSuccess: Bool) -> Void { }
public func dataVerificationWillStart(isCacheHit: Bool) -> Void { }
public func dataVerificationDidEnd(isCacheHit: Bool) -> Void { }

Khi bật cache và cache hit, nfcScanDidEnd sẽ không được gọi — hãy tự hiển thị giao diện xác minh của bạn từ dataVerificationWillStart:

swift
public func dataVerificationWillStart(isCacheHit: Bool) -> Void {
  if (isCacheHit) {
    // show your UI for data verification here
  } else {
    // SDK shows its dialog and asks the user to scan as normal
  }
}

public func dataVerificationDidEnd(isCacheHit: Bool) -> Void {
  if (isCacheHit) {
    // close your UI for data verification here
  } else {
    // SDK closes its own dialog
  }
}

Thời gian chờ thử lại ​

Mỗi CESNfcError.SessionOnGoing đi kèm một thời gian chờ khuyến nghị trước lần quét tiếp theo. SDK tự xử lý việc này; bạn có thể tinh chỉnh thời lượng ban đầu theo từng dòng máy.

swift
CESNfcConfig(baseUrl: "<BASE_URL>",
            sessionDelayConfig: CESSessionDelayConfig(
            defaultDelayMs: 10000,
            mappingDurations: [
                DeviceModel.iPhone15ProMax.rawValue: 15000,
                DeviceModel.iPhone7Plus.rawValue: 12000
            ])
        )

Xử lý lỗi ​

Lỗi được ném dưới dạng CESNfcError. Danh sách đầy đủ nằm ở Mã lỗi; những lỗi bạn sẽ gặp nhiều nhất:

TrườngKiểuMô tả
NFCNotSupported600032NFC không được hỗ trợ trên thiết bị này.
SessionOnGoing600101Một phiên đọc khác đang diễn ra.
SystemResourceUnavailable600102Hệ thống NFC đang bận.
UserCanceled600432Người dùng đã hủy.
InvalidFullMRZKey600316Khóa MRZ không hợp lệ.
InvalidCANKey600317Khóa CAN không hợp lệ.
InvalidCardType600396Thẻ được quét không phải CCCD.
NetworkError601400Xảy ra lỗi mạng.
ServerError601503Xảy ra lỗi server.

Hàm dựng sẵn ​

swift
public var isNfcAvailable: Bool {
    NFCNDEFReaderSession.readingAvailable
}

iOS không có isNfcEnable hay openNfcSetting — hai hàm đó chỉ dành cho Android.

Kiểm tra cấu hình IPA ​

Nếu NFC hoạt động ở bản debug nhưng thất bại ở bản build production, hãy kiểm tra artefact đã build.

Info.plist phải chứa:

  • NFCReaderUsageDescription với một usage description
  • com.apple.developer.nfc.readersession.iso7816.select-identifiers chứa A0000002471001, A0000002472001 và 00000000000000

embedded.mobileprovision phải chứa com.apple.developer.nfc.readersession.formats với entitlement TAG.

Bước tiếp theo ​

Developers