Staging environment — data here is not production data
Browse documentation

Fidera documentation

iOS onboarding SDK

Integrate Fidera’s headless Swift client, reusable SwiftUI, Universal Links, Keychain resume, capture, and passport NFC.

The Swift package publishes FideraSDK for headless orchestration and FideraOnboardingUI for reusable SwiftUI. The onboarding client accepts only an applicant capability; do not ship a tenant API key in an app.

Add the package

Add platforms/ios/FideraSDK as a Swift Package dependency while developing locally, or use the published package version for a release. Link FideraSDK; link FideraOnboardingUI when using the supplied journey shell.

Initialize one client for the app:

let onboarding = FideraOnboardingClient(
    baseURL: URL(string: "https://verify.fideralabs.com")!
)

KeychainOnboardingCredentialStore is the default. It keeps the rotating, Flow-scoped session and a random installation identifier. It never persists the original link fragment.

Add the Associated Domains entitlement:

applinks:verify.fideralabs.com

Register the production team ID and bundle ID in Fidera Settings. Pass the incoming URL directly to the client:

.onOpenURL { url in
    Task {
        try await onboarding.handle(universalLink: url)
        let context = try await onboarding.context()
    }
}

Call resume() on launch. It returns an unexpired Keychain credential or clears expired state. Use refresh() before expiry during long journeys. Never log the incoming URL, because it contains the one-time fragment secret.

Build the journey

FideraOnboardingView supplies tenant branding, shared progress, neutral completion, and capture orchestration hooks. Inject the SDK’s native camera, MRZ, selfie, liveness, and passport-NFC screens or your own equivalent views.

Every semantic progress update includes version. On 409, reload context and let the user continue from the returned current state. Retry signed uploads by requesting a fresh grant after expiry; retry completion and processing with a stable idempotency key.

For passports, photo and MRZ work without NFC. If the template marks NFC required, use the native Core NFC reader before submission. If it is optional, record lower assurance when the applicant chooses or must use the photo/MRZ fallback. The server remains authoritative.

Migrate the proof of concept

The Acme demo no longer starts Flows with embedded tenant keys. Existing integrations should:

  1. remove tenant secret or publishable keys from Info.plist, build settings, and app configuration;
  2. register the app in Fidera Settings and enable Associated Domains;
  3. replace direct FideraClient.createFlow calls with FideraOnboardingClient.handle(universalLink:);
  4. restore state from Keychain and shared Flow progress;
  5. replace any applicant-facing outcome view with neutral completion;
  6. read tenant-authenticated Check results on a trusted backend.

There is no App Clip target. E-passport chip reading requires an installed app with the full Core NFC entitlement and API surface.