Skip to main content

iOS, Android & React Native

The native wrappers for iOS (Swift / Objective-C), Android (Kotlin / Java) and React Native open a full-screen WebView that runs the Web SDK engine from a hosted page, so capture behaves the same on every platform and engine updates reach your app without a release. At runtime they need a camera and internet access to https://iapp.co.th/sdk/webview.html.

Every wrapper has the same flows:

Install and run a flow​

  1. Requires iOS 15+ and NSCameraUsageDescription in Info.plist.
  2. In Xcode choose File → Add Package Dependencies…, enter https://github.com/iapp-technology/iapp-ekyc-sdk and add the product IappEkyc.
  3. Present a flow and handle the result.
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 ?? [:]) // full OCR response
case .failure(let error as NSError)
where error.code == IappEkycErrorCode.cancelled.rawValue:
break // user cancelled
case .failure(let error):
print(error.localizedDescription) // error.code: IappEkycErrorCode
}
}

Active liveness returns the server-signed verdict:

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 {
// Verify verdictJSON + signature on YOUR backend — never trust
// `passed` alone on-device.
upload(liveness.verdictJSON, liveness.signature, liveness.selfieImageData)
}
}

Objective-C uses the same classes through a 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

Shared behavior​

  • API key: pass apiKey: "" and set baseUrl to your own backend to keep the key on the server. The key reaches the bridge page after it loads, never through the URL. SECURITY.md
  • Theme and language: the same tokens and en / th / zh locales as the Web SDK, set in each platform's config object.
  • Liveness verdicts: only the server-signed verdict proves a pass. Recompute its HMAC on your backend before trusting passed; see Face Active Liveness.
  • Cancel: the in-flow Cancel button, the Android back button and an iOS swipe-dismiss all return a cancel outcome; dismissing or unmounting the flow aborts it cleanly.
  • Bridge protocol: the full wrapper-to-engine contract is in WEBVIEW_BRIDGE.md.

© 2026 iApp Technology Co., Ltd.TermsPrivacyStatussale@iapp.co.th