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
- Drag both
VeryAILiveness.xcframeworkandPalmAPISaas.xcframeworkinto your Xcode project. - General → Frameworks, Libraries, and Embedded Content — set both to Embed & Sign.
- Build Settings → LD_RUNPATH_SEARCH_PATHS — ensure
@executable_path/Frameworksis present (default for new projects). - 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.