Skip to main content

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 a UINavigationController to present its verification UI. The library handles this automatically:
  1. Retrieves the root view controller from the key window
  2. If it’s already a UINavigationController, uses it directly
  3. If not, wraps the verification flow in a new UINavigationController
  4. Presents the navigation controller modally

State Management

Both iOS and Android maintain the initialized state across multiple verification flows. The SDK remains initialized after startVerification() completes. To explicitly reset the state and release resources, call dispose().

Thread Safety

All SDK operations are dispatched to the main thread:
This is critical because:
  • Flutter MethodChannel calls may arrive on any thread
  • UIKit operations must run on the main thread
  • SDK delegate callbacks need main thread context

Permissions

Required Info.plist keys:
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:
Ensure your project includes mavenCentral() in repositories:

Proxy Activity Pattern

The Android implementation uses a transparent proxy Activity to manage the verification flow. Why a proxy Activity:
  1. Lifecycle requirementActivityResultLauncher must be registered before the STARTED lifecycle state
  2. Clean separation — Keeps verification logic separate from the host app’s Activities
  3. Result management — Provides a clean way to bridge async results back to Dart
  4. No UI interference — Transparent theme means users don’t see the proxy Activity
Manifest configuration:

MissingLocationPermission Status

Android has a specific verification status for missing location permissions. The proxy Activity maps SEONOrchFlowResult 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 in AndroidManifest.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:
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:
This is why the proxy Activity pattern is essential — it provides a fresh lifecycle boundary for each verification.

Common Platform Differences

Verification Result Mapping

Both platforms map native SDK result enums to the common SeonVerificationStatus 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
For security reasons, the SEON SDK actively detects simulators and emulators and may refuse to operate. Always test on real physical devices.

Testing Considerations

  • Debug builds may have different SDK behavior
  • Always test release builds before shipping
  • Permissions may behave differently in debug mode

Native SDK References

For platform-specific details beyond the Flutter wrapper, see the native SDK documentation: