Swift SDK for World ID verification, backed by the Rust core via UniFFI.
- Xcode 16+
- iOS 15+ / macOS 12+
- Rust toolchain (for local artifact generation)
From repo root:
bash scripts/package-swift.shThis builds Rust artifacts, regenerates Swift bindings, and links swift/IDKitFFI.xcframework.
import IDKit
let rpContext = try RpContext(
rpId: "rp_1234567890abcdef",
nonce: backend.nonce,
createdAt: backend.createdAt,
expiresAt: backend.expiresAt,
signature: backend.sig
)
let config = IDKitRequestConfig(
appId: "app_staging_1234567890abcdef",
action: "login",
rpContext: rpContext,
actionDescription: "Log in",
bridgeUrl: nil,
allowLegacyProofs: false,
requireUserPresence: false,
overrideConnectBaseUrl: nil,
returnTo: nil,
environment: .staging
)
let request = try IDKit
.request(config: config)
.preset(orbLegacy(signal: "user-123"))
print("Connector URL:", request.connectorURL)
let completion = await request.pollUntilCompletion()
switch completion {
case .success(let result):
print("Verified", result)
case .failure(let error):
print("Failed", error.rawValue)
}For orb-or-device legacy verification, use:
let request = try IDKit
.request(config: config)
.preset(deviceLegacy(signal: "user-123"))For selfie-check verification, use:
let request = try IDKit
.request(config: config)
.preset(selfieCheckLegacy(signal: "user-123"))For document-based identity attestation, use:
let request = try IDKit
.request(config: config)
.preset(
identityCheck(
attributes: [
.minimumAge(21),
.nationality("JPN"),
.documentType(.passport),
]
)
)- Entry points:
IDKit.request(config:)IDKit.createSession(config:)IDKit.proveSession(sessionId:config:)
- Request object:
connectorURL: URLrequestID: UUIDpollStatusOnce() async -> IDKitStatuspollUntilCompletion(options:) async -> IDKitCompletionResult
- Hashing:
IDKit.hashSignal(_ signal: String) -> StringIDKit.hashSignal(_ signal: Data) -> String
See parity mapping: swift/docs/API_PARITY_MATRIX.md.
let orb = try CredentialRequest.create(
.orb,
options: .init(
signal: "user-123",
genesisIssuedAtMin: 1_700_000_000,
expiresAtMin: 1_800_000_000
)
)A runnable iOS sample exists at:
swift/Examples/IDKitSampleApp/IDKitSampleApp.xcodeproj
Run it:
bash scripts/package-swift.shopen swift/Examples/IDKitSampleApp/IDKitSampleApp.xcodeproj- Choose
IDKitSampleAppscheme and an iOS Simulator. - Tap Generate Connector URL.
- Confirm the URL appears in UI and in the console (
IDKit connector URL: ...).
bash scripts/package-swift.shcd swift && swift build && swift testcd swift && xcodebuild test -scheme IDKit -destination "platform=macOS"xcodebuild -project swift/Examples/IDKitSampleApp/IDKitSampleApp.xcodeproj -scheme IDKitSampleApp -destination "generic/platform=iOS Simulator" CODE_SIGNING_ALLOWED=NO build
Cannot find libidkitFFI.a:- Re-run
bash scripts/package-swift.sh.
- Re-run
Failed to connect/connection_failed:- Check bridge URL/network and backend-generated RP context values.
timeout:- Increase
IDKitPollOptions(timeoutMs:)or verify user completed flow in World App.
- Increase
cancelled:- The polling task was cancelled by the host app.