Skip to main content

📲 iOS, Android และ React Native

eKYC SDK มี แรปเปอร์เนทีฟ สำหรับ iOS (Swift / Objective-C), Android (Kotlin / Java) และ React Native โดยแต่ละแรปเปอร์จะแสดง WebView แบบเต็มจอที่รันเอนจินเดียวกับ Web SDK ผ่านหน้าบริดจ์ที่โฮสต์ไว้ — การถ่ายเอกสารอัตโนมัติและ Face Active Liveness จึงทำงานเหมือนกันทุกแพลตฟอร์ม การปรับปรุงเอนจินส่งถึงแอปของท่านโดยไม่ต้องอัปเดตแอป และแรปเปอร์แทบไม่เพิ่มขนาดไฟล์ติดตั้งเลย

แรปเปอร์ทุกตัวมีโฟลว์กล้อง 3 แบบเหมือนกัน:

โฟลว์หน้าที่ค่าบริการ API
documentCaptureถ่ายเอกสารอัตโนมัติแล้วส่งประมวลผล OCR (บัตรประชาชน, หนังสือเดินทาง, บัตรราชการอื่น ๆ)0.75–1.25 IC
activeLivenessคำสั่งท้าทาย Face Active Liveness พร้อมผลตัดสินลงลายเซ็นจากเซิร์ฟเวอร์1 IC
faceCaptureถ่ายเซลฟี่หน้าตรงคมชัดอัตโนมัติ (ไม่มีคำสั่งท้าทาย) สำหรับ เปรียบเทียบใบหน้า / 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 + signature บนเซิร์ฟเวอร์ของท่านเสมอ —
// อย่าเชื่อค่า `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];
// อิมพลีเมนต์ 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 + signature บนเซิร์ฟเวอร์ของท่าน
upload(result.verdictJson, result.signature, result.selfieImage)
is IappEkycResult.FaceCaptured -> useSelfie(result.image)
is IappEkycResult.Failed -> show(result.error) // error.code: EkycErrorCode
IappEkycResult.Cancelled -> {}
}
}

// เรียกใช้โฟลว์ใดก็ได้:
ekyc.launch(IappEkycRequest.DocumentCapture(config, EkycDocumentType.THAI_ID_FRONT))
ekyc.launch(IappEkycRequest.ActiveLiveness(config))
ekyc.launch(IappEkycRequest.FaceCapture(config))

รองรับ Java เต็มรูปแบบผ่าน API แบบ callback:

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 อยู่ระหว่างดำเนินการ — ติดตั้งจากซอร์สโค้ด) พร้อม peer dependency react-native-webview:

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 โฟลว์

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="ถ่ายบัตรประชาชน" 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 เช่น 'INSUFFICIENT_CREDIT'
onCancel={() => setActive(false)}
/>
</Modal>
</>
);
}

พฤติกรรมที่ใช้ร่วมกันทุกแพลตฟอร์ม

  • ความปลอดภัยของคีย์ API — ส่ง apiKey: "" และตั้ง baseUrl เป็นเซิร์ฟเวอร์ของท่านเพื่อเก็บคีย์ไว้ฝั่งเซิร์ฟเวอร์ (โหมดพร็อกซี) คีย์จะถูกส่งเข้าหน้าบริดจ์หลังโหลดเสร็จ ไม่ผ่าน URL เด็ดขาด รายละเอียด: SECURITY.md บน GitHub
  • ธีมและภาษา — ใช้โทเคนธีมและภาษา en/th/zh ชุดเดียวกับ Web SDK ผ่านออบเจ็กต์ config ของแต่ละแพลตฟอร์ม
  • ผลตัดสิน — ผล Active Liveness พิสูจน์ได้ด้วยผลตัดสินที่ลงลายเซ็นจากเซิร์ฟเวอร์เท่านั้น: คำนวณ HMAC ซ้ำบนเซิร์ฟเวอร์ของท่านก่อนเชื่อค่า passed ดู Face Active Liveness
  • การยกเลิก — ปุ่มยกเลิกในโฟลว์ ปุ่มย้อนกลับของ Android และการปัดปิดบน iOS ล้วนคืนผลลัพธ์เป็นการยกเลิก การปิด/ถอดโฟลว์ออกจะหยุดกล้องและยุติโฟลว์อย่างสมบูรณ์
  • สัญญาบริดจ์ — โปรโตคอลระหว่างแรปเปอร์กับเอนจินฉบับเต็มอยู่ที่ WEBVIEW_BRIDGE.md บน GitHub