eimzo_flutter 1.0.2
eimzo_flutter: ^1.0.2 copied to clipboard
Flutter plugin wrapping the official E-IMZO Mobile SDK for Uzbekistan electronic signatures. Supports PFX/QR/NFC ID-card/USB token signing and eimzo:// deep links.
eimzo_flutter #
Thin Flutter plugin that bootstraps the official E-IMZO Mobile SDK (eimzo-sdk-1.0.0.aar bundled inside) on the host activity. All signing / key-management UI is owned by the native SDK; the Flutter side just initializes it and receives eimzo://sign?... deep links.
Platform support #
| Android | iOS |
|---|---|
| ✅ (minSdk 24) | ✅ (iOS 16+) |
Setup #
1. Add the dependency #
dependencies:
eimzo_flutter: ^1.0.0
2. Android app/build.gradle #
android {
compileSdk 34
defaultConfig {
minSdk 24
targetSdk 34
}
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions { jvmTarget = '17' }
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
}
3. AndroidManifest.xml — declare the deep-link intent-filter #
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="eimzo" android:host="sign" />
</intent-filter>
</activity>
Permissions (INTERNET, NFC, CAMERA, READ_EXTERNAL_STORAGE ≤ API 32) and the NFC / USB-host <uses-feature> declarations are merged in from the plugin manifest automatically.
4. Theme — must inherit Material Components #
The SDK's blocked-app screen requires a Material theme:
<style name="LaunchTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<style name="NormalTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
5. iOS — minimum deployment target #
In ios/Podfile:
platform :ios, '16.0'
6. iOS — Info.plist permissions and deeplink scheme #
<!-- Camera (QR scanner) -->
<key>NSCameraUsageDescription</key>
<string>QR-kod skanerlash uchun kamera kerak</string>
<!-- NFC (ID-karta) -->
<key>NFCReaderUsageDescription</key>
<string>ID-karta orqali kalit o'qish uchun NFC kerak</string>
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
<string>65696D7A6F617070</string> <!-- "eimzoapp" ASCII -->
</array>
<!-- eimzo:// deep links -->
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>YOUR.BUNDLE.ID.signing</string>
<key>CFBundleURLSchemes</key>
<array>
<string>eimzo</string>
</array>
</dict>
</array>
7. iOS — NFC entitlement #
Add to Runner.entitlements (create the file if missing and link it via Xcode → Signing & Capabilities → + Capability → Near Field Communication Tag Reading):
<key>com.apple.developer.nfc.readersession.formats</key>
<array><string>TAG</string></array>
Apple requires a one-time NFC entitlement approval on your Developer Portal account for production builds.
8. License #
The SDK is license-gated. Send your app's package name (Android) and bundle identifier (iOS) to info@yt.uz for approval. Unregistered apps automatically see the SDK's built-in blocked screen with an in-app email request form.
Usage #
import 'package:eimzo_flutter/eimzo_flutter.dart';
import 'package:flutter/foundation.dart';
class _AppState extends State<App> {
final _eimzo = EimzoFlutter.instance;
@override
void initState() {
super.initState();
_bootstrap();
_eimzo.onNewDeeplink().listen((link) {
// handle eimzo://sign?qc=... while app is running
});
}
Future<void> _bootstrap() async {
final initial = await _eimzo.getInitialDeeplink(); // cold-start link
final allowed = await _eimzo.init(
config: const EimzoConfig(isTestMode: kDebugMode),
);
if (!allowed) return; // SDK is showing its blocked screen
// ... proceed with normal app flow
}
}
API #
EimzoFlutter.instance.init({EimzoConfig config})→Future<bool>— runsEImzoSDK.checkLicenseAndIniton the host activity. Returnstrueif the app is licensed,falseif the SDK has shown its blocked screen.EimzoFlutter.instance.getInitialDeeplink()→Future<String?>— theeimzo://sign?...URL the app was cold-started with (consume once).EimzoFlutter.instance.onNewDeeplink()→Stream<String>— broadcast stream of links delivered while the app is running.
EimzoConfig takes isTestMode (default false), and optional productionApiUrl / testApiUrl overrides.
EimzoException(code, message) wraps PlatformException errors from the native side.
License #
MIT