iOS, Android & React Native
eKYC SDK มาพร้อมกับ Native Wrapper สำหรับ iOS (Swift / Objective-C), Android (Kotlin / Java), และ React Native แต่ละ Wrapper จะแสดงเต็มหน้าจอ WebView ที่รันเอนจิ้นการผลิตเดียวกันกับ Web SDK จากหน้า Bridge ที่โฮสต์ไว้ — ดังนั้นการจับภาพเอกสารอัตโนมัติและ Face Active Liveness จะทำงานเหมือนกันในทุกแพลตฟอร์ม การปรับปรุงเอนจิ้นจะเข้าถึงแอปของคุณได้โดยไม่ต้องอัปเดต และ Wrapper แทบ จะเพิ่มขนาดของไบนารีของคุณเพียงเล็กน้อย
Wrapper ทั้งหมดจะเปิดเผย Flow กล้องสามแบบเดียวกัน:
| Flow | การทำงาน | API ที่คิดค่าบริการ |
|---|---|---|
documentCapture | จับภาพเอกสารอัตโนมัติและส่งเพื่อ OCR (บัตรประชาชน, หนังสือเดินทาง, บัตรราชการ) | 0.75–1.25 IC |
activeLiveness | ท้าทาย Face Active Liveness + ผลลัพธ์ที่ลงนามโดยเซิร์ฟเวอร์ | 1 IC |
faceCapture | จับภาพเซลฟี่หน้าตรงที่คมชัดอัตโนมัติ (ไม่มีการท้าทาย) สำหรับ Face Verification / Passive Liveness | ฟรี (เฉพาะการจับภาพ) |
ข้อกำหนด: การเข้าถึงอินเทอร์เน็ตไปยัง https://iapp.co.th/sdk/webview.html ขณะรันไทม์ (eKYC ต้องการการเชื่อมต่อสำหรับการเรียก API อยู่แล้ว) พร้อมกับกล้อง
iOS (Swift / Objective-C)
ติดตั้ง: Xcode → File → Add Package Dependencies… → https://github.com/iapp-technology/iapp-ekyc-sdk → product IappEkyc ต้องใช้ iOS 15+ และรายการ NSCameraUsageDescription ใน Info.plist
import IappEkyc
let config = IappEkycConfig(apiKey: "YOUR_API_KEY", flow: .documentCapture)
config.documentType = .thaiIdFront // .thaiIdBack .passport .thaiDriverLicense .bookBank .thaiIdWithSignature
config.locale = .th // .en / .th / .zh
IappEkycSdk.present(from: self, config: config) { result in
switch result {
case .success(let outcome):
print(outcome.document?.rawJSON ?? [:]) // ผลลัพธ์ OCR เต็มรูปแบบ
case .failure(let error as NSError)
where error.code == IappEkycErrorCode.cancelled.rawValue:
break // ผู้ใช้ยกเลิก
case .failure(let error):
print(error.localizedDescription) // error.code: IappEkycErrorCode
}
}
Active liveness จะคืนค่าผลลัพธ์ที่ลงนามโดยเซิร์ฟเวอร์:
let config = IappEkycConfig(apiKey: "YOUR_API_KEY", flow: .activeLiveness)
IappEkycSdk.present(from: self, config: config) { result in
if case .success(let outcome) = result, let liveness = outcome.liveness {
// ตรวจสอบ verdictJSON + ลายเซ็นบนแบ็กเอนด์ของคุณ — อย่าเชื่อถือ
// `passed` เพียงอย่างเดียวบนอุปกรณ์
upload(liveness.verdictJSON, liveness.signature, liveness.selfieImageData)
}
}
Objective-C ใช้คลาสเดียวกันผ่าน delegate:
@import IappEkyc;
IappEkycConfig *config = [[IappEkycConfig alloc] initWithApiKey:@"YOUR_API_KEY"
flow:IappEkycFlowTypeDocumentCapture];
config.documentType = IappEkycDocumentTypeThaiIdFront;
[IappEkycSdk presentFrom:self config:config delegate:self];
// Implement IappEkycViewControllerDelegate: didFinishWithResult / didFailWithError / didCancel
Android (Kotlin / Java)
ติดตั้ง ผ่าน JitPack — minSdk 24, พร้อม Android System WebView ที่อัปเดตล่าสุด:
// settings.gradle.kts
dependencyResolutionManagement {
repositories { google(); mavenCentral(); maven("https://jitpack.io") }
}
// app/build.gradle.kts
dependencies { implementation("com.github.iapp-technology:iapp-ekyc-sdk:v0.2.0") }
ไลบรารีจะประกาศสิทธิ์ CAMERA และขอสิทธิ์นั้นขณะรันไทม์ด้วยตนเอง
val config = IappEkycConfig.Builder("YOUR_API_KEY").locale(EkycLocale.TH).build()
private val ekyc = registerForActivityResult(IappEkycContract()) { result ->
when (result) {
is IappEkycResult.DocumentCaptured -> handleOcr(result.rawJson)
is IappEkycResult.LivenessPassed ->
// ตรวจสอบ verdictJson + ลายเซ็นบนแบ็กเอนด์ของคุณ
upload(result.verdictJson, result.signature, result.selfieImage)
is IappEkycResult.FaceCaptured -> useSelfie(result.image)
is IappEkycResult.Failed -> show(result.error) // error.code: EkycErrorCode
IappEkycResult.Cancelled -> {}
}
}
// เริ่มต้น Flow ใดก็ได้:
ekyc.launch(IappEkycRequest.DocumentCapture(config, EkycDocumentType.THAI_ID_FRONT))
ekyc.launch(IappEkycRequest.ActiveLiveness(config))
ekyc.launch(IappEkycRequest.FaceCapture(config))
Java รองรับอย่างเต็มที่ผ่าน Callback API:
IappEkyc.start(this,
new IappEkycRequest.DocumentCapture(config, EkycDocumentType.THAI_ID_FRONT),
new IappEkycCallback() {
@Override public void onResult(IappEkycResult result) { /* ... */ }
@Override public void onError(IappEkycError error) { /* ... */ }
@Override public void onCancelled() { }
});
React Native
ติดตั้ง (การเผยแพร่ npm กำลังรออยู่ — ติดตั้งจากการ checkout) พร้อม react-native-webview ที่เป็น peer dependency:
git clone https://github.com/iapp-technology/iapp-ekyc-sdk
npm install ./iapp-ekyc-sdk/react-native react-native-webview
cd ios && pod install
iOS: เพิ่ม NSCameraUsageDescription Android: เพิ่มสิทธิ์ CAMERA และขอสิทธิ์ ก่อนที่จะ mount Flow
import { useState } from 'react';
import { Button, Modal, PermissionsAndroid, Platform } from 'react-native';
import { IappEkycFlow } from '@iapp-technology/react-native-ekyc-sdk';
function KycScreen() {
const [active, setActive] = useState(false);
const start = async () => {
if (Platform.OS === 'android') {
const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.CAMERA);
if (granted !== PermissionsAndroid.RESULTS.GRANTED) return;
}
setActive(true);
};
return (
<>
<Button title="Capture Thai ID" onPress={start} />
<Modal visible={active} animationType="slide" presentationStyle="fullScreen">
<IappEkycFlow
flow="documentCapture" // 'documentCapture' | 'activeLiveness' | 'faceCapture'
documentType="thaiIdFront"
apiKey="YOUR_API_KEY"
locale="th"
onResult={(result) => { setActive(false); console.log(result); }}
onError={(error) => setActive(false)} // error.code, e.g. 'INSUFFICIENT_CREDIT'
onCancel={() => setActive(false)}
/>
</Modal>
</>
);
}
พฤติกรรมที่ใช้ร่วมกัน
- ความปลอดภัยของ API key — ส่ง
apiKey: ""และตั้งค่าbaseUrlเป็นแบ็กเอนด์ของคุณเองเพื่อเก็บคีย์ไว้ฝั่งเซิร์ฟเวอร์ (โหมดพร็อกซี) คีย์จะถูกแทรกเข้าไปในหน้า Bridge หลังจากโหลดแล้ว จะไม่ผ่าน URL เด็ดขาด รายละเอียด: SECURITY.md บน GitHub - การปรับแต่งธีมและภาษา — โทเค็นเดียวกันและภาษา
en/th/zhเหมือนกับ Web SDK ส่งผ่านอ็อบเจกต์การกำหนดค่าของแต่ละแพลตฟอร์ม - ผลลัพธ์ — ผลลัพธ์ active-liveness จะได้รับการพิสูจน์ด้วย ผลล ัพธ์ที่ลงนามโดยเซิร์ฟเวอร์ เท่านั้น: คำนวณ HMAC ใหม่บนแบ็กเอนด์ของคุณก่อนที่จะเชื่อถือ
passedดู Face Active Liveness - การยกเลิก — ปุ่มยกเลิกใน Flow, ปุ่มย้อนกลับของ Android และการปัดเพื่อปิดของ iOS ทั้งหมดจะแสดงผลลัพธ์การยกเลิก การปิด/ถอนการติดตั้ง Flow จะยกเลิกอย่างสะอาด
- สัญญา Bridge — โปรโตคอล Wrapper↔Engine ฉบับเต็มมีเอกสารประกอบใน WEBVIEW_BRIDGE.md บน GitHub