iOS Integration
1. Install the SDK
CocoaPods
pod 'VerySDK', '~> 1.0.53' Then run pod install.
Swift Package Manager
dependencies: [
.package(url: "https://github.com/veroslabs/very-sdk-ios.git", from: "1.0.53")
] 2. Configure your app
Add camera permission to Info.plist:
<key>NSCameraUsageDescription</key>
<string>Camera access is needed for palm biometric verification.</string> 3. Enroll a new user
Pass nil for userId to register a new user. The SDK opens a consent screen, then guides the user through a palm scan.
import VerySDK
// Check device support first
guard VerySDK.isSupported() else {
print("Device not supported")
return
}
let config = VeryConfig(
sdkKey: "your_sdk_key", // from Developer Portal
userId: nil, // nil = new enrollment
themeMode: "dark" // "dark" or "light"
)
VerySDK.authenticate(
from: self,
config: config,
presentationStyle: .modal // .modal, .push, or .embed
) { result in
if result.isSuccess {
print("User ID: \(result.userId)")
print("Signed token: \(result.signedToken ?? "")")
} else {
print("Error: \(result.errorType) — \(result.errorMessage ?? "")")
}
} 4. Verify an existing user
Pass the user's ID from a previous enrollment to verify their identity.
let config = VeryConfig(
sdkKey: "your_sdk_key",
userId: "vu-1ed0a927-...", // existing user's ID from previous enrollment
themeMode: "dark"
)
VerySDK.authenticate(
from: self,
config: config,
presentationStyle: .modal
) { result in
if result.isSuccess {
print("Verified user: \(result.userId)")
print("Signed token: \(result.signedToken ?? "")")
} else {
print("Error: \(result.errorType) — \(result.errorMessage ?? "")")
}
} 5. Verify the signed token (backend)
When authentication succeeds, the SDK returns userId and signedToken. Send signedToken to your backend:
POST /api/verify-palm
Content-Type: application/json
{
"signedToken": "eyJhbGciOiJFZERTQSIsImtpZCI6..."
}
Verify the JWT signature with VeryAI's public keys at https://api.very.org/.well-known/jwks.json.
After verification, trust the sub claim as the user's VeryAI ID:
{
"sub": "vu-1ed0a927-a336-45dd-9c73-20092db9ae8d",
"exp": 1761013475,
"iat": 1761009875
} - For enrollment: store the
sub(user ID) - use it for future verifications - For verification: confirm the
submatches the expected user codeis an SDK status string, not an OAuth authorization code
VeryConfig
| Parameter | Type | Description |
|---|---|---|
sdkKey | String | Your SDK API key from the Developer Portal |
userId | String? | nil for enrollment, user ID for verification |
language | String? | BCP 47 locale code (e.g. "en", "es", "en-IN", "zh-HK"). Defaults to device language. |
themeMode | String | "dark" (default) or "light" |
VeryResult
| Property | Type | Description |
|---|---|---|
isSuccess | Bool | true if authentication completed successfully |
code | String | SDK status string, not an OAuth authorization code |
userId | String | The user's app-scoped VeryAI ID |
signedToken | String? | Ed25519-signed JWT for backend verification |
errorType | VeryErrorType | Typed error code (see Error Handling) |
errorMessage | String? | Human-readable error message |
Presentation styles
.modal— presented as a modal sheet (default).push— pushed onto the current navigation stack.embed— embedded as a child view controller
Important: Native SDK verification uses signedToken and JWKS. It does not use OAuth client_id, client_secret, or code exchange.