Mobile SDK overview
Embed SenseCrypt face authentication directly in your own iOS or Android app — device-bound keys, on-device face matching and liveness, the authentication flows, and the passkey-provider surface.
The SenseCrypt Authenticator SDK embeds face authentication into your iOS or Android application. Your app gets a device-bound key in secure hardware, on-device face matching and liveness, and the same authentication flows the SenseCrypt Authenticator app uses — because that app is itself built on this SDK. The device key proves the device, and the live face match proves the person.
The SDK is not publicly published. It is distributed on request, as versioned binary artifacts (an Android .aar and an iOS Swift package). If your integration needs it, contact SenseCrypt to be provisioned with SDK access and a development license. Most integrations do not need it — if you only want SenseCrypt sign-in for a web or mobile app, integrate over standard OIDC/SAML and let users approve with the Authenticator app. See Relying party.
When to use the SDK
Use the SDK when you need the face ceremony to happen inside your own app, rather than handing the user off to the Authenticator app. Typical reasons:
- Your app is the authenticator for your product, and a second app is unacceptable UX.
- You are building a kiosk, field-service, or single-purpose device app where installing a separate authenticator isn't possible.
- You need to own the enrollment and sign-in screens end to end for branding or compliance reasons.
- Your users sign in to your app itself, and you want a face scan in the app, with no browser and no second app. That is in-app sign-in, for a tenant that runs its own app.
If none of those apply, integrate over OIDC/SAML instead — it is dramatically less work and carries no license, no native binaries, and no biometric surface in your app.
What the SDK gives you
- Device-bound keys. Key material is generated in the platform's secure hardware (Secure Enclave on iOS, Android Keystore on Android) and never leaves it. Every SDK call to SenseCrypt is signed with that key.
- On-device face matching and liveness. Detection, matching, and liveness run locally against models bundled in the SDK. No image and no biometric template leaves the device — SenseCrypt remains biometric-blind.
- Nine typed flows. Registration, login, in-app sign-in, face-PKI ceremonies, the passkey face report, the Android cross-device ceremony, key rotation, revocation, and face capture, each a state machine you observe rather than orchestrate.
- A passkey-provider surface. Everything a credential-provider extension or service needs except what only an app can own: publishing identities to the OS, signing the assertion offline, and the hand-off to the face report. See Passkeys and the face report.
- Optional drop-in UI. Ready-made QR-scan and face-capture surfaces (SwiftUI views, Compose composables) with camera handling, permission gating, and retry chrome already built. You can also drive the flows with your own UI.
Architecture
The SDK is a Rust core exposed to each platform through UniFFI bindings, with a hand-written idiomatic facade on top:
Your app → Swift / Kotlin facade → UniFFI bindings → Rust core
├── flow state machines
├── portal HTTP client (signed)
└── ML: detection, matching, liveness
platform callbacks ────────────────────────────┘
(Secure Enclave / Keystore, biometric prompt, secure storage, attestation)Two consequences worth knowing up front:
The flows live in Rust, not in your app. You submit inputs (a QR payload, a PIN, a face capture) and observe emitted states. Retry budgets, signed aborts, network retries, and key ceremonies are all handled inside the core. This is deliberate — the security-critical sequencing is not something each host app should re-implement.
Platform-native concerns are injected callbacks. Key wrapping, secure storage, the biometric gate, and device attestation are implemented per platform and wired in by open(). You don't implement these; the SDK does it for you.
Platform support
| iOS | Android | |
|---|---|---|
| Minimum version | iOS 15 | API 24 (Android 7.0) |
| Artifact | Swift package + static XCFramework | .aar |
| Architectures | arm64 (device), arm64 + x86_64 (simulator) | arm64-v8a, armeabi-v7a |
| UI toolkit for bundled surfaces | SwiftUI (UIKit wrappers provided) | Jetpack Compose |
| Flow observation | AsyncStream | SharedFlow / StateFlow |
Android has no x86/x86_64 slices. The AAR ships arm64-v8a and armeabi-v7a only. It will not run on an x86_64 emulator — use an ARM system image (which is the default on Apple Silicon) or a physical device.
The flows
Each flow except face capture is started from the SenseCryptAuthenticator handle; all emit a typed state and terminate in success, cancellation, or failure.
| Flow | Purpose | Page |
|---|---|---|
| Registration | Enroll a user and mint a device key — via emailed PIN, or full self-signup | Registration |
| Login | Approve a sign-in: scan QR, match face, post result | Login |
| In-app sign-in | Sign the user in to your app with a face scan, no browser, and hold IdP-issued DPoP-bound tokens. Tenants running their own app only | In-app sign-in |
| Face-PKI ceremony | Answer a request against face-unlocked post-quantum keys: public keys, a signature, or a decapsulation | Face PKI |
| Face report | Prove the person after a passkey assertion has been parked: the second half of a passkey sign-in | Passkeys |
| Cross-device ceremony (Android) | Sign a passkey assertion for a FIDO:/ code scanned from a desktop browser | Passkeys |
| Key rotation | Make-before-break rotation of every key on the device | Key management |
| Revocation | Remove one device key | Key management |
| Face capture | Shared capture sub-flow, vended by login, registration, the face report and face-PKI ceremonies | UI components |
Getting started
Install
Add the artifact, place the license, declare permissions and dependencies.
Initialize
open() the SDK and load the inference engine.
Login flow
The most common integration — approve a sign-in.
In-app sign-in
Sign users in to your own app with a face scan and get DPoP-bound tokens, no browser.
Running as the tenant's app
App links, URL scheme, attestation identity and push when your app replaces the Authenticator.
Error reference
Every error case and what to do about it.
Related
- Authenticator app — the end-user app, if you don't need to embed.
- Ship your own Authenticator app — registering your app with the tenant so the server verifies it.
- Relying party — integrating over OIDC/SAML with no SDK.
- How SenseCrypt works — the end-to-end model.
- Security — biometric blindness and key custody.
Mobile (Authenticator)
The SenseCrypt Authenticator app for iOS and Android — the end-user app that approves sign-ins and key requests with a face scan. Most integrations use it as-is rather than embedding anything.
Install
Add the SenseCrypt Authenticator SDK to an iOS or Android project — artifact placement, the development license, required dependencies, and camera permissions.