VeryAI Raises $10M Seed Round
Liveness SDK Guides /

iOS Integration

iOS Integration

Prebuilt binary distribution of the VeryAILiveness palm-liveness SDK for iOS. A liveness check opens a single-shot palm scan that confirms a live human palm — no enrollment, no verification, no signed token.

1. Install the SDK

CocoaPods (recommended)

pod 'VeryAILiveness'           # slim — model downloads on first scan (~5–15 s)
pod 'VeryAILiveness/Bundled'   # ships ~8 MB packed_data.bin in the framework

Then run pod install.

Swift Package Manager

.package(url: "https://github.com/veroslabs/very-ai-liveness-ios.git", from: "1.0.55")

Two product names are exposed: VeryAILiveness (slim) and VeryAILivenessBundled (ships the model inside the framework).

Manual XCFramework

  1. Drag both VeryAILiveness.xcframework and PalmAPISaas.xcframework into your Xcode project.
  2. General → Frameworks, Libraries, and Embedded Content — set both to Embed & Sign.
  3. Build Settings → LD_RUNPATH_SEARCH_PATHS — ensure @executable_path/Frameworks is present (default for new projects).
  4. Add the system frameworks the SDK depends on (CocoaPods/SPM auto-link these; manual integration must add them): AVFoundation, CoreImage, CoreMedia, CoreVideo, CryptoKit, QuartzCore.

Manual integration is slim by default. For bundled mode, also drop packed_data.bin (shipped alongside the xcframeworks) into your app target's resources.

Important: VeryAILiveness.xcframework depends on PalmAPISaas.xcframework at runtime. Both must be embedded — embedding only VeryAILiveness will crash with dyld: Library not loaded: @rpath/PalmAPISaas.framework/PalmAPISaas.

2. Configure your app

Add camera permission to Info.plist:

<key>NSCameraUsageDescription</key>
<string>Camera access is needed for a liveness check.</string>

3. Run a liveness check

import VeryAILiveness

// Optional — kicks off the model prefetch and verifies camera/RAM.
guard VeryAILiveness.isSupported() else {
    // device unsupported, fall back
    return
}

let config = VeryLivenessConfig(
    sdkKey: "your-sdk-key",       // required — issued by Very
    themeMode: "dark",            // "light" or "dark"
    language: "en",                // optional — ISO 639-1, defaults to system locale
    livenessMode: .touch,          // .touch (default) or .gesture
    debugLogging: true             // recommended during integration
)

VeryAILiveness.check(
    from: viewController,
    config: config,
    presentationStyle: .modal      // .modal (default) or .push
) { result in
    DispatchQueue.main.async {
        switch result.code {
        case "success":
            // liveness passed
            break
        case "cancelled":
            // user dismissed the page
            break
        default:
            // result.error / result.errorMessage carry the failure detail
            break
        }
    }
}

VeryLivenessConfig is a slim subset of the full SDK's VeryConfig — no userId, since liveness binds no user identity, but sdkKey is required to authenticate the backend session calls.

VeryLivenessConfig

Parameter Type Description
sdkKey String Required — your SDK API key from the Developer Portal
themeMode String "dark" or "light"
language String? Optional — ISO 639-1 code, defaults to system locale
livenessMode Enum .touch (default) or .gesture
debugLogging Bool Recommended during integration

VeryResult

VeryResult.code is one of "success", "cancelled", or "error". On non-success, result.error carries an SDK error code and result.errorMessage carries a localized human-readable message.

Presentation styles

  • .modal — presented as a modal sheet (default)
  • .push — pushed onto the current navigation stack

Asset loading

This distribution ships in slim mode by default — packed_data.bin (~8 MB) is downloaded from CDN on first scan and cached under Application Support/; subsequent launches use the cache. Plan for a loading state on the first scan (5–15 s on typical networks).

Use pod 'VeryAILiveness/Bundled' (CocoaPods) or VeryAILivenessBundled (SPM) to bundle the model in your binary instead — first scan is instant, app size grows by ~8 MB.

Network endpoints

If your network restricts egress, allowlist the following:

Purpose URL
Liveness session create https://api.very.org/v1/sdk/liveness-sessions
Liveness result POST https://api.very.org/v1/sdk/liveness-sessions/{id}/result
Model download (primary) https://assets.very.org/sdk/v3/packed_data.bin
Model download (backup) https://r2.assets.very.org/sdk/v3/packed_data.bin

The result POST is fire-and-forget — it doesn't block the host completion. The model download path is unused in bundled mode after the first install.

VeryAI

Get the VeryAI app

Scan the QR code to download the app