Skip to content

Tích hợp iOS SDK ​

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

Yêu cầu build ​

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

Thiết lập dependency ​

Thêm các file *.framework vào target của bạn, sau đó khai báo quyền camera:

xml
<key>NSCameraUsageDescription</key>
<string>Camera access helps us give you a better experience</string>

Thêm các pod sau:

ruby
pod 'TensorFlowLiteSwift', '2.6.0'
pod 'GoogleMLKit/FaceDetection', '6.0.0'
pod 'PromisesSwift', '~> 2.3.1'
pod 'SnapKit', '~> 5.0.1'

Khởi tạo và cấu hình ​

CakeEkycSdk.getInstance trả về một Future<CakeEkycSdk, Never>.

swift
let config = CESConfig.Builder()
    .withBaseUrl(url: "<BASE_URL>")
    .withToken(tokenProvider: tokenProvider)
    .withLanguage(language: .vi)
    .withLogger(logger: logger)
    .build()

self.cancelable = CakeEkycSdk.getInstance(config: config)
    .receive(on: DispatchQueue.main)
    .sink { [weak self] ekycSdk in
        self?.ekycSdk = ekycSdk
    }

Chụp thẻ NID ​

Tuân thủ CESNidCapturingDelegate và gọi takeNid.

swift
class YourUIViewController: UIViewController, CESNidCapturingDelegate {
    func onSuccess(result: CESNidCardResult) {}

    func onError(error: CESError) {}

    func onEvent(event: CESEkycEvent) {}

    private func startTakeNid() {
        guard let ekycSdk else { return }
        let config = CESTakeNidConfig(
            cardType: .cccd,
            cardSides: [.front, .back],
            requiredReview: true,
            autoCaptureEnable: true,
            requiredScanQR: false,
            captureOnly: false,
            loadingView: loadingView
        )
        ekycSdk.takeNid(hostViewController: self, config: config, delegate: self)
    }
}

Truyền mặt còn lại ​

swift
let frontSide: CESEkycImage

ekyc.takeNid(
    hostViewController: self,
    config: CESTakeNidConfig(
        cardSides: [CESCardSide.back],
        otherSideImages: [CESCardSide.front: frontImage]
    ),
    delegate: self
)

Lỗi ​

TrườngKiểuMô tả
CESError.userCancelled40001Người dùng nhấn back.
CESError.timeoutError40000Timeout.
CESError.permissionNotGranted40002Các quyền chưa được cấp.
CESError.qualityFailed60000 / 60001kErrorCodeNidSanityFailed hoặc kErrorCodeNidTamperingFailed.
CESError.unexpectedError50000Runtime exception.

INFO

iOS SDK không có mã lỗi riêng cho camera. 40003 (CameraError) chỉ tồn tại trên Android và Flutter — lỗi camera trên iOS xuất hiện dưới dạng unexpectedError.

Chụp khuôn mặt ​

swift
class YourUIViewController: UIViewController, CESFaceCapturingDelegate {
    func onSuccess(result: CESSelfieResult) {}

    func onError(error: CESError) {}

    func onEvent(event: CESEkycEvent) {}

    private func startFace() {
        guard let ekycSdk else { return }
        let config = CESTakeFaceConfig(captureOnly: false, loadingView: loadingView)
        ekycSdk.takeFaces(hostViewController: self, config: config, delegate: self)
    }
}

Lỗi chất lượng ở đây mang kErrorCodeFaceSanityFailed (60002) hoặc kErrorCodeFaceLivenessFailed (60003).

Giao diện loading tùy chỉnh ​

Truyền UIView của riêng bạn vào CESTakeNidConfig.loadingView hoặc CESTakeFaceConfig.loadingView để thay thế màn hình loading của SDK trong lúc tải lên và kiểm tra chất lượng.

Tải ảnh lên ​

swift
let uploadResult = ekycSdk.upload(image: image, label: label, metaData: metaData)
switch uploadResult {
case .success(data: let uploadResponse):
    debugPrint("success: \(uploadResponse.data?.imageId)")
case .fail(error: let error):
    debugPrint("fail: \(error)")
default: fatalError()
}

Data cũng được chấp nhận: ekycSdk.upload(data: data, label: label, metaData: metaData).

Xem Tổng quan Mobile SDK § Nhãn ảnh để biết các giá trị label được phép.

Các lệnh gọi API riêng lẻ ​

Mỗi lệnh nhận một params struct và trả về CESResult<CESEkycResponse<T>>.

swift
// Sanity — cả hai mặt, hoặc chỉ truyền image cho một mặt
let params = CESCheckNidSanityParams(
    image: frontNIDImageId,
    image2: backNIDImageId,
    cardType: "vn.national_id",
    specialTypeId: ""
)
let sanityResult = ekycSdk.checkNidSanity(params: params)

switch sanityResult {
case .success(data: let sanityResponse):
    debugPrint("success: \(sanityResponse.data?.cardSanityData)")
case .fail(error: let error):
    debugPrint("fail: \(error)")
default: fatalError()
}
swift
let tamperingResult = ekycSdk.checkNidTampering(params: CESCheckNidTamperingParams(
    image: frontNIDImageId, image2: backNIDImageId, cardType: "vn.national_id", level: nil))

let readNidResult = ekycSdk.readNidInfo(params: CESNidReadInfoParams(
    image: frontNIDImageId, image2: backNIDImageId, cardType: "vn.national_id"))

let faceSanity   = ekycSdk.checkFaceSanity(params: CESFaceSanityParams(image: "face_image_id"))
let faceLiveness = ekycSdk.checkFaceLiveness(params: CESFaceLivenessParams(images: ["face_image_id"]))
let compared     = ekycSdk.compareFaces(params: CESFaceCompareParams(image1: "face_1", image2: "face_2"))
Phương thứcAPI
checkNidSanityXác minh ID Card Sanity
checkNidTamperingPhát hiện giả mạo thẻ ID
readNidInfoĐọc thông tin thẻ ID
checkFaceSanityXác minh sanity khuôn mặt
checkFaceLivenessXác minh liveness khuôn mặt
compareFacesSo sánh khuôn mặt

INFO

CESFaceLivenessParams nhận images: [String] — truyền một mảng, không phải một image đơn lẻ.

Bước tiếp theo ​

Developers