usesense_flutter 2.4.9
usesense_flutter: ^2.4.9 copied to clipboard
Flutter plugin for UseSense human presence verification. Wraps native iOS and Android SDKs for DeepSense (device integrity), LiveSense (proof-of-life), and MatchSense (identity collision detection).
Changelog #
All notable changes to usesense_flutter will be documented in this file.
This project adheres to Semantic Versioning.
2.4.9 - 2026-08-13 #
Changed #
- Bumped the native SDK pins to 4.7.1 on both platforms:
ai.usesense:sdk4.7.0→4.7.1andUseSenseSDK~> 4.7.0→~> 4.7.1. No API or runtime change in this plugin.- Android 4.7.1 is the release that makes Android verification work at all. Every API call was addressed to a doubled
/v1/v1/path, which the server rejects before reading the request body; because the signals upload carries megabytes, that rejection deadlocked instead of erroring, so the subject watched "Finalizing Enrollment" spin forever and nothing reached the server. No Android integration had ever completed a production verification. Anyone on an older pin is still affected. - Android 4.7.1 also un-doubles the front camera preview mirror (CameraX already mirrors it, and a manual flip on top cancelled it, so subjects turned right and saw themselves go left), and both platforms now pass the org's white-label into the capture screens rather than showing default blue on consent, loading and capture.
- The iOS pin moves from
~> 4.7.0to~> 4.7.1deliberately.~> 4.7.0already permits 4.7.1, but it also still permits 4.7.0, so a resolver could pick a build without these fixes. Raising the floor is what guarantees them. - Supersedes the
4.7.0pin bump that landed without a version or changelog entry.
- Android 4.7.1 is the release that makes Android verification work at all. Every API call was addressed to a doubled
2.4.8 - 2026-08-05 #
Changed #
- Bumped the native SDK pins so the runner reports how the subject supplied the document:
ai.usesense:sdk4.6.6→4.6.7andUseSenseSDK~> 4.6.2→~> 4.6.3. No API or runtime change in this plugin.- The server tailors document failure guidance to the capture route. "Hold the document still and wait for the camera to focus" is the right instruction for a live scan and meaningless to someone who chose an existing file: the photo already exists, and there is nothing left to hold. Below these versions the runner never said which route was taken, so the server had to guess from the step's configured capture methods, which is only decisive when a step permits exactly one.
2.4.7 - 2026-08-04 #
Changed #
- Bumped the native SDK pins so an upload that arrives incomplete is no longer reported as an outage:
ai.usesense:sdk4.6.5→4.6.6andUseSenseSDK~> 4.6.1→~> 4.6.2. No API or runtime change in this plugin.- Both SDKs previously had two outcomes on a document upload failure:
provider→ "Verification is temporarily unavailable", everything else → "please retake it". A file that arrived cut short took the first path, so a subject holding a perfectly good document was told to wait out an outage that was not happening, and the retry re-sent identical bytes. The server now reportsreason: "incomplete"and carries the instruction inmessage; neither old branch fits it, since nothing upstream is wrong and a retake changes nothing. - This bump is not required to fix anything in production. The corruption that produced those failures was server-side, is already fixed, and applies to every installed build without an update. This only improves what the subject is told when an upload genuinely is cut short.
- Both SDKs previously had two outcomes on a document upload failure:
2.4.6 - 2026-07-31 #
Changed #
- Bumped the native SDK pins to the releases that fix capture from stalling:
ai.usesense:sdk4.6.4→4.6.5andUseSenseSDK~> 4.6→~> 4.6.1. The iOS constraint was widened by accident:~> 4.6resolves any 4.6.x, so an existingPodfile.lockhappily stayed on 4.6.0.~> 4.6.1makes the fix a floor while still allowing future patches. No API or runtime change in this plugin.- Android 4.6.5 — verification could hang forever on "Finalizing Enrollment". The Play Integrity token request had no timeout and the signal upload joined it unbounded, so a Play services call that never settled wedged the whole verification before the first HTTP request was issued.
- iOS 4.6.1 — a failed document upload tore the runner down and ejected the subject mid-flow; dismissing the scanner or photo picker cancelled the entire verification; full-resolution scans could be rejected as
payload_too_largeafter the subject had already done the work.
2.4.5 - 2026-07-09 #
Changed #
- Bumped the native SDK pin
ai.usesense:sdk4.6.1→4.6.4, aligning the Flutter plugin with the React Native package on a single native SDK version. 4.6.2–4.6.4 were consumability fixes for Kotlin <2.2 toolchains (React Native); Flutter's toolchain is Kotlin ≥2.2 so it was already unaffected, but 4.6.4 is strictly more compatible (lower Kotlin metadata, no unused viewBinding) and keeps the wrappers consistent. No API or runtime change.
2.4.4 - 2026-07-09 #
Fixed #
- Android release builds failing at manifest merge on AGP 8.x (
Namespace 'org.tensorflow.lite' is used in multiple modules and/or libraries). Bumped the native SDK pinai.usesense:sdk4.6.0→4.6.1, which upgrades TensorFlow Lite to 2.16.1 (fixing the duplicate-namespace collision betweentensorflow-liteand its transitivetensorflow-lite-api) and drops the unusedtensorflow-lite-support. Integrators no longer need aresolutionStrategy/excludeworkaround in their app. No API or runtime change.
Changed — action required #
- Minimum Android SDK is now 28 (was declared 24). The native
ai.usesense:sdkhas requiredminSdk 28since v4.1; the plugin previously mis-declared 24, which failed a consuming app's release manifest merge (uses-sdk:minSdkVersion 24 cannot be smaller than version 28 declared in library [ai.usesense:sdk]) — masked until now by the TFLite collision above. Consuming apps must setminSdkVersion 28inandroid/app/build.gradle.
2.4.3 - 2026-07-09 #
Fixed #
- Android build failing to compile
android/build.gradle.ktson recent stable Flutter. The module used the legacyandroid { kotlinOptions { jvmTarget = … } }DSL. Newer Kotlin Gradle plugins (bundled with current stable Flutter) markkotlinOptions/jvmTargetas deprecation-level ERROR, and nestingkotlinOptionsinsideandroid {}also forces theandroidaccessor to resolve to the deprecatedLibraryExtensiontype — so the script failed to compile with three errors before dependency resolution even started (assembleRelease→ "Script compilation errors: 3 errors"). Migrated the Kotlin JVM target to the top-levelkotlin { compilerOptions { jvmTarget = JvmTarget.JVM_17 } }DSL. This is what the release-build CI guard added in 2.4.2 surfaced. No API or runtime change.
2.4.2 - 2026-07-09 #
Fixed #
- Android release builds failing to resolve the Flutter embedding.
android/build.gradle.ktshardcodedcompileOnly("io.flutter:flutter_embedding_debug:1.0.0-…"), which pinned a fixed Flutter engine hash and the debug variant into every consumer's build. Any app whose Flutter SDK differed from the one used to cut the plugin (i.e. effectively all of them) failed withCould not resolve io.flutter:flutter_embedding_debug … inconsistent module metadata found … bad version: expected=… found=…, and the debug embedding leaked into release compiles (compileReleaseKotlinonreleaseCompileClasspath). Removed the hardcoded dependency — the Flutter Gradle plugin already injectsflutter_embedding_<buildMode>as anapidependency of every plugin subproject at the consuming app's engine version and matching build variant, so the embedding API classes remain on the compile classpath. No API or runtime behaviour change.
2.4.1 - 2026-06-28 #
Changed #
- Pinned the native SDK to 4.6.0 (Sense rebrand): iOS
UseSenseSDK ~> 4.6, Androidai.usesense:sdk:4.6.0. Previously Android was hard-pinned to 4.5.0.
2.3.0 - 2026-06-27 #
Added #
- White-label
appearance(FlowAppearance) andcopy(FlowCopy) overrides, forwarded through the iOS and Android Flows bridges toUseSenseFlows.runso the verification flow's look and copy can be customised from the SDK or the dashboard.
Changed #
- Pinned UseSenseSDK to 4.5.0 (iOS
~> 4.5, Androidai.usesense:sdk:4.5.0), which ships the appearance/copy API the bridge calls.
Fixed #
- Removed an invalid trailing comma in the iOS bridge's
UseSenseFlows.run(...)call that would fail to compile on pre-Swift-6.1 toolchains.
2.2.1 - 2026-06-23 #
Fixed #
- Android build failure. Since 2.1.0 the Android bridge passed
antispoofOnDeviceEnabled+liveSenseV4EnabledtoUseSenseConfig, but those params shipped only on the iOS SDK — the pinned Android SDK (ai.usesense:sdk:4.3.0) lacked them, so Android consumers failed to compile. Bumped the Android SDK pin to4.4.0, which adds both params (and the on-device antispoof + LiveSense v4 support) at iOS parity. iOS is unaffected (the~> 4.4CocoaPods pin already resolvesUseSenseSDK 4.4.1).
2.2.0 - 2026-06-23 #
Pins the native iOS SDK to 4.4.0, which makes on-device face mesh work out of the box. Additive and backward-compatible.
Fixed #
- iOS face capture "No frames captured." The face liveness step records frames
only when on-device face mesh (MediaPipe) is linked. UseSenseSDK 4.4.0 vendors
patched MediaPipe and pulls it in automatically — no per-app
MediaPipeTasksVisionpod,pre_installInfo.plist hook, or:linkage => :staticchange. Plainuse_frameworks!works (UseSenseSDK 4.4 is astatic_framework).
Changed #
- iOS dependency pinned to
UseSenseSDK ~> 4.4(was~> 4.3).
2.1.0 - 2026-06-16 #
Tracks the native SDK 4.3.0 release. Additive and backward-compatible —
existing integrations are unaffected; both new flags default to false.
Added #
UseSenseConfig.liveSenseV4Enabled— opt the session into the LiveSense v4 capture flow (constitutive zoom-motion phase + per-frame capture-phase tagging +x-usesense-sdk-version: v4header). The org must also havelivesense_v4_enabledin its server-side features map. Threaded through the Pigeon interface to both platforms.UseSenseConfig.antispoofOnDeviceEnabled— opt in to the on-device CelebA-Spoof classifier (native loads the bundled model and attaches per-frame spoof probabilities to the upload). Defaults off, in which case the watchtower backend runs the classifier server-side.
Changed #
- Native SDK dependency bumped to
4.3.0(iOSUseSenseSDK ~> 4.3via CocoaPods; Androidai.usesense:sdk:4.3.0via Maven Central).
2.0.1 - 2026-04-11 #
No-op release. Bumps the package version with no code changes in
order to validate the release.yml GitHub Actions workflow and the
pub.dev OIDC publishing path end-to-end. The 2.0.0 release was
published manually from a local dart pub publish because the
OIDC pipeline wasn't wired up yet; this release flushes the same
bits through the automated pipeline so subsequent releases can rely
on tag-pushes as the single source of truth.
No API, wire, or runtime behavior changes — 2.0.0 and 2.0.1 are
binary- and source-compatible.
2.0.0 - 2026-04-11 #
Breaking release. Combines the native-SDK / infrastructure /
tooling alignment that was originally planned for 1.1.0 with a
single wire-level breaking change: removal of the deprecated
gatewayKey field from PigeonUseSenseConfig (and therefore from
the public Dart-facing UseSenseConfig). Since the plugin has
never been published to pub.dev and nobody is currently consuming
the 1.0.0 git tag, the breaking change is safe to land directly.
Removed — BREAKING #
UseSenseConfig.gatewayKeyis gone from the Dart API, from the Pigeon-generated.g.dart/.g.swift/.g.ktfiles, and from the Pigeon interface atpigeons/usesense_api.dart. The field was a v1.x artefact from the pre-v4 native SDK era when the plugin passed a gateway token through to the native SDK. The native SDKs removed the corresponding parameter in v4.0 when the Cloudflare Worker proxy took over gateway responsibilities server-side, and the plugin was keepinggatewayKeyaround only as a deprecated no-op for backward compatibility. Removing it from the Pigeon wire shifts the encoded field indices (brandingmoves from index 4 to 3,googleCloudProjectNumberfrom 5 to 4), so the change is wire-incompatible with any1.0.0consumer even thoughgatewayKeyitself was a no-op. Bumping to 2.0.0 makes that visible.
Migration from 1.0.0 #
Remove any gatewayKey: argument from your
UseSenseConfig(...) calls:
UseSenseConfig(
apiKey: 'sk_sandbox_...',
environment: UseSenseEnvironment.sandbox,
- gatewayKey: 'obsolete', // remove this line
)
No other public API changes. apiKey, environment, baseUrl,
branding, googleCloudProjectNumber, startVerification,
startRemoteEnrollment, startRemoteVerification, onEvent,
onCancelled, reset — all unchanged. Code that wasn't passing
gatewayKey compiles and runs unchanged against 2.0.0.
Non-breaking: everything else originally planned for 1.1.0 #
Added #
- CI workflow at
.github/workflows/ci.yml— runsflutter analyze,dart format --set-exit-if-changed,flutter test, andflutter pub publish --dry-runon every PR. - Release workflow at
.github/workflows/release.yml— triggers onv*tag push, verifies the pubspec version matches the tag, runs the full CI suite, and publishes to pub.dev via OIDC (no long-lived secret required; see the workflow header for the one-time pub.dev Automated Publishing setup). Creates a matching GitHub Release with auto-generated release notes. .github/governance files:CODEOWNERS, PR template, bug report + feature request issue templates — matching the layout ofqudusadeyemi/usesense-ios-sdkandqudusadeyemi/usesense-android-sdk.- Example app now accepts the API key at runtime via a
TextFieldwith show/hide toggle, a sandbox/productionSwitch, andshared_preferencespersistence across launches. Matches the iOS example's@AppStorage("apiKey")+SecureFieldpattern and the Android example'sSharedPreferencespattern — integrators clone, run, paste their key once, and test without touching any source code. Removes the hardcodedsk_test_YOUR_SANDBOX_API_KEYplaceholder inexample/lib/main.dart. shared_preferences: ^2.3.2added as an example-only dependency. The plugin itself has no runtime state to persist.
Changed #
- Native iOS SDK dep in
ios/usesense_flutter.podspecbumped from~> 1.0.0to~> 4.2. The v1.x SDK used a pre-redaction result type and a differentUseSenseConfiginit signature; v4.2+ is the current shape used by iOS and Android alike. - Native Android SDK dep in
android/build.gradle.ktsbumped fromai.usesense:sdk:1.0.0toai.usesense:sdk:4.2.1. The Android SDK is now on Maven Central (published as part of the v4.2.0 / v4.2.1 release cycle), somavenCentral()is the only repository integrators need. - iOS plugin (
UseSenseFlutterPlugin.swift) no longer passesgatewayKeytoUseSenseConfig. The field was removed from the native SDK in v4.0 when the Cloudflare Worker proxy took over gateway responsibilities server-side. The Pigeon interface still accepts the field as a deprecated no-op for backward compatibility; it will be removed from the public Pigeon API in the next major release. - Android plugin (
UseSenseFlutterPlugin.kt) ditto — no longer passesgatewayKeyto the nativeUseSenseConfig. - iOS plugin error mapping extended to cover the v4.x-era
error codes (
tokenExpired,tokenAlreadyUsed,insufficientCredits,nonceMismatch) that were added to the native SDK alongside the token-exchange / step-up flows. - Default primary colour in the iOS plugin's BrandingConfig
fallback bumped from
#4F63F5(legacy indigo) to#4F7CFF(DeepSense Blue per Brand Manual v3.0), matching the native iOS SDK's default. - CONTRIBUTING.md gains a "Maintainer notes" section documenting the Pigeon code generation workflow, the native SDK version management process, and the pub.dev OIDC setup.
Fixed #
pubspec.yamlrepositoryfield pointed at the retiredgithub.com/usesense/usesense-flutternamespace. Corrected togithub.com/qudusadeyemi/flutter-usesense.pubspec.yamldocumentationfield pointed at the retireddocs.usesense.aidomain. Corrected towatchtower.usesense.ai/developer-docs.README.md"Support" section's repository link had the same stale namespace. Fixed.README.mdAndroid install section referenced a fabricatedmaven.usesense.com/releasesrepository that never existed. Removed; the native SDK is now on Maven Central.example/README.mdsetup instructions referenced the retiredapp.usesense.aidashboard. Corrected towatchtower.usesense.ai.
Notes for integrators #
- Except for the removed
gatewayKeyfield (see the "Removed — BREAKING" section above), no other public Dart API surface has changed.UseSenseConfiggains no new fields, andVerificationRequest,UseSenseResult, andUseSenseEventare unchanged. Code that wasn't passinggatewayKeycompiles and runs unchanged.
1.0.0 - 2026-03-13 #
Added #
UseSenseFlutter.initialize()for SDK configuration with API key and environmentUseSenseFlutter.startVerification()for enrollment and authentication sessionsUseSenseFlutter.startRemoteEnrollment()for hosted enrollment flowsUseSenseFlutter.startRemoteVerification()for hosted verification flowsUseSenseFlutter.onEventstream for real-time session event listeningUseSenseFlutter.onCancelledstream for user cancellation detectionUseSenseFlutter.isInitialized()for initialization state checkingUseSenseFlutter.reset()for SDK cleanup and resource releaseUseSenseResultwith decision (APPROVE, REJECT, MANUAL_REVIEW), session ID, identity ID, and convenience getters (isApproved,isRejected,isPendingReview)UseSenseErrorwith 13 structured error codes and retry guidanceUseSenseEventwith 18 event types covering the full session lifecycleBrandingConfigfor UI customization (logo, colors, button radius, font)- Pigeon-based type-safe platform channels (Dart, Kotlin, Swift)
- iOS support via UseSenseSDK (iOS 16.0+)
- Android support via UseSense Android SDK (API 24+)
- Multi-screen example app with enrollment, authentication, and event log
- Comprehensive README, integration guide, and pub.dev packaging
- CI/CD workflows for pull requests and pub.dev releases