Documentation Index
Fetch the complete documentation index at: https://jdev-e8db0569.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
iOS
Requirements
- Minimum iOS version: iOS 13.0 or higher
- CocoaPods: Required for dependency management
- Swift: The native implementation is written in Swift
Dependencies
The library depends on the native SEON Orchestration SDK, declared in the podspec:UINavigationController Handling
The SEON SDK requires aUINavigationController to present its verification UI. The library handles this automatically:
- Retrieves the root view controller from the key window
- If it’s already a
UINavigationController, uses it directly - If not, wraps the verification flow in a new
UINavigationController - Presents the navigation controller modally
State Management
Both iOS and Android maintain the initialized state across multiple verification flows. The SDK remains initialized afterstartVerification() completes. To explicitly reset the state and release resources, call dispose().
Thread Safety
All SDK operations are dispatched to the main thread:- Flutter MethodChannel calls may arrive on any thread
- UIKit operations must run on the main thread
- SDK delegate callbacks need main thread context
Permissions
RequiredInfo.plist keys:
| Permission Key | Purpose |
|---|---|
NSCameraUsageDescription | ID verification and selfie capture |
NSMicrophoneUsageDescription | Video liveness checks |
NSLocationWhenInUseUsageDescription | GeoLocation for fraud prevention API |
NSPhotoLibraryUsageDescription | Proof of address document upload |
The SEON SDK handles runtime permission requests automatically during the verification flow.
Android
Requirements
- Minimum SDK version: API 26 (Android 8.0) or higher
- Compile SDK version: API 36 (as configured in the plugin’s
build.gradle) - Kotlin: The library is written in Kotlin
Dependencies
The library depends on the native SEON Orchestration SDK from Maven Central:mavenCentral() in repositories:
Proxy Activity Pattern
The Android implementation uses a transparent proxy Activity to manage the verification flow. Why a proxy Activity:- Lifecycle requirement —
ActivityResultLaunchermust be registered before the STARTED lifecycle state - Clean separation — Keeps verification logic separate from the host app’s Activities
- Result management — Provides a clean way to bridge async results back to Dart
- No UI interference — Transparent theme means users don’t see the proxy Activity
| Attribute | Purpose |
|---|---|
Theme.Translucent.NoTitleBar | Makes the Activity invisible to users |
exported="false" | Activity is only for internal use |
MissingLocationPermission Status
Android has a specific verification status for missing location permissions. The proxy Activity mapsSEONOrchFlowResult result codes to status strings:
The
missingLocationPermission value exists in the Dart enum for forward compatibility but is not currently emitted by the native Android SDK. Location permission denial is reported as an error status with a descriptive errorMessage.Permissions
Required permissions inAndroidManifest.xml:
Hardware Feature Declarations
You should also declare required hardware features. These affect Google Play Store filtering — devices without a camera will not see your app in the store:| Permission | Purpose |
|---|---|
CAMERA | ID verification and selfie capture |
RECORD_AUDIO / MODIFY_AUDIO_SETTINGS | Video liveness checks |
ACCESS_FINE_LOCATION | GeoLocation for fraud prevention API |
WRITE_EXTERNAL_STORAGE / READ_EXTERNAL_STORAGE | Proof of address document handling (legacy Android) |
The SEON SDK handles runtime permission requests during the verification flow. If permissions are denied, the verification will fail with an appropriate status.
ActivityResultLauncher Lifecycle
ActivityResultLauncher must be registered before the Activity reaches the STARTED state. In the proxy Activity, it’s registered at the property level — before onCreate() is even called:
Common Platform Differences
| Aspect | iOS | Android |
|---|---|---|
| Initialization | State held in Swift singleton | Config passed directly to OrchestrationService |
| Error handling | FlutterResult with FlutterError | FlutterResult with FlutterError |
| Thread context | Explicit main thread dispatch | Activity lifecycle ensures UI thread |
| Verification UI | UINavigationController | Transparent proxy Activity |
Verification Result Mapping
Both platforms map native SDK result enums to the commonSeonVerificationStatus enum:
Verification UI
The verification flow on both platforms occurs within a WebView context. This is important to understand when:- Debugging UI issues in the verification flow
- Understanding why permissions like camera and microphone are required
- Troubleshooting Content Security Policy (CSP) or network-related issues
Testing Considerations
- Debug builds may have different SDK behavior
- Always test release builds before shipping
- Permissions may behave differently in debug mode