Skip to content

Commit ffb8016

Browse files
committed
feat(swift): expose IdentityCheck preset in Swift SDK
1 parent 70d187f commit ffb8016

5 files changed

Lines changed: 70 additions & 8 deletions

File tree

scripts/build-swift.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ echo ""
2424
echo "🔧 Step 2/3: Generating Swift bindings..."
2525
mkdir -p "$GENERATED_DIR"
2626

27-
uniffi-bindgen generate \
27+
cargo run -p uniffi-bindgen generate \
2828
--library target/release/libidkit.dylib \
2929
--language swift \
30+
--no-format \
3031
--out-dir "$GENERATED_DIR"
3132

3233
echo "✅ Generated Swift bindings to: $GENERATED_DIR"

swift/Examples/IDKitSampleApp/IDKitSampleApp/ContentView.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ enum SampleLegacyPreset: String, CaseIterable, Identifiable {
2121
case document
2222
case device
2323
case selfieCheck = "selfie check"
24+
case identityCheck = "identity check"
2425

2526
var id: String { rawValue }
2627

@@ -36,6 +37,15 @@ enum SampleLegacyPreset: String, CaseIterable, Identifiable {
3637
deviceLegacy(signal: signal)
3738
case .selfieCheck:
3839
selfieCheckLegacy(signal: signal)
40+
case .identityCheck:
41+
identityCheck(
42+
attributes: [
43+
.minimumAge(21),
44+
.nationality("JPN"),
45+
.documentType(.passport),
46+
],
47+
requireProofOfHumanity: true
48+
)
3949
}
4050
}
4151
}
@@ -76,7 +86,7 @@ struct ContentView: View {
7686
}
7787
.pickerStyle(.segmented)
7888

79-
Picker("Legacy preset", selection: $model.legacyPreset) {
89+
Picker("Preset", selection: $model.legacyPreset) {
8090
ForEach(SampleLegacyPreset.allCases) { preset in
8191
Text(preset.rawValue).tag(preset)
8292
}
@@ -201,7 +211,7 @@ final class SampleModel: ObservableObject {
201211
deepLinkReceivedForPendingRequest = false
202212

203213
print("IDKit connector URL: \(request.connectorURL.absoluteString)")
204-
log("Using legacy preset: \(legacyPreset.rawValue)")
214+
log("Using preset: \(legacyPreset.rawValue)")
205215
log("Generated request ID: \(request.requestID.uuidString)")
206216
log("Configured return_to callback: \(returnToURL)")
207217
startPollingForRequest(request: request, reason: "request generation")

swift/README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,23 @@ let request = try IDKit
7474
.preset(selfieCheckLegacy(signal: "user-123"))
7575
```
7676

77+
For document-based identity attestation, use:
78+
79+
```swift
80+
let request = try IDKit
81+
.request(config: config)
82+
.preset(
83+
identityCheck(
84+
attributes: [
85+
.minimumAge(21),
86+
.nationality("JPN"),
87+
.documentType(.passport),
88+
],
89+
requireProofOfHumanity: true
90+
)
91+
)
92+
```
93+
7794
## Canonical Swift API
7895

7996
- Entry points:

swift/Sources/IDKit/IDKit.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,19 @@ public func selfieCheckLegacy(signal: String? = nil) -> Preset {
363363
.selfieCheckLegacy(signal: signal)
364364
}
365365

366+
/// Returns the identity check preset.
367+
///
368+
/// This preset requires World ID 4.0-compatible clients.
369+
public func identityCheck(
370+
attributes: [IdentityAttribute],
371+
requireProofOfHumanity: Bool = false
372+
) -> Preset {
373+
.identityCheck(
374+
attributes: attributes,
375+
requireProofOfHumanity: requireProofOfHumanity
376+
)
377+
}
378+
366379
// TODO: Re-enable when World ID 4.0 is live
367380
// private struct CredentialRequestJSON: Encodable {
368381
// let type: String

swift/Tests/IDKitTests/IDKitTests.swift

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -231,41 +231,62 @@ func legacyPresetHelpers() {
231231
let doc = documentLegacy(signal: "z")
232232
let device = deviceLegacy(signal: "d")
233233
let face = selfieCheckLegacy(signal: "f")
234+
let identity = identityCheck(
235+
attributes: [
236+
.minimumAge(21),
237+
.nationality("JPN"),
238+
.documentType(.passport)
239+
],
240+
requireProofOfHumanity: true
241+
)
234242

235243
switch orb {
236244
case .orbLegacy(let signal):
237245
#expect(signal == "x")
238-
case .secureDocumentLegacy, .documentLegacy, .deviceLegacy, .selfieCheckLegacy:
246+
case .secureDocumentLegacy, .documentLegacy, .deviceLegacy, .selfieCheckLegacy, .identityCheck:
239247
Issue.record("Expected orbLegacy preset")
240248
}
241249

242250
switch secureDoc {
243251
case .secureDocumentLegacy(let signal):
244252
#expect(signal == "y")
245-
case .orbLegacy, .documentLegacy, .deviceLegacy, .selfieCheckLegacy:
253+
case .orbLegacy, .documentLegacy, .deviceLegacy, .selfieCheckLegacy, .identityCheck:
246254
Issue.record("Expected secureDocumentLegacy preset")
247255
}
248256

249257
switch doc {
250258
case .documentLegacy(let signal):
251259
#expect(signal == "z")
252-
case .orbLegacy, .secureDocumentLegacy, .deviceLegacy, .selfieCheckLegacy:
260+
case .orbLegacy, .secureDocumentLegacy, .deviceLegacy, .selfieCheckLegacy, .identityCheck:
253261
Issue.record("Expected documentLegacy preset")
254262
}
255263

256264
switch device {
257265
case .deviceLegacy(let signal):
258266
#expect(signal == "d")
259-
case .orbLegacy, .secureDocumentLegacy, .documentLegacy, .selfieCheckLegacy:
267+
case .orbLegacy, .secureDocumentLegacy, .documentLegacy, .selfieCheckLegacy, .identityCheck:
260268
Issue.record("Expected deviceLegacy preset")
261269
}
262270

263271
switch face {
264272
case .selfieCheckLegacy(let signal):
265273
#expect(signal == "f")
266-
case .orbLegacy, .secureDocumentLegacy, .documentLegacy, .deviceLegacy:
274+
case .orbLegacy, .secureDocumentLegacy, .documentLegacy, .deviceLegacy, .identityCheck:
267275
Issue.record("Expected selfieCheckLegacy preset")
268276
}
277+
278+
switch identity {
279+
case let .identityCheck(attributes, requireProofOfHumanity):
280+
let expected: [IdentityAttribute] = [
281+
.minimumAge(21),
282+
.nationality("JPN"),
283+
.documentType(.passport)
284+
]
285+
#expect(attributes == expected)
286+
#expect(requireProofOfHumanity)
287+
case .orbLegacy, .secureDocumentLegacy, .documentLegacy, .deviceLegacy, .selfieCheckLegacy:
288+
Issue.record("Expected identityCheck preset")
289+
}
269290
}
270291

271292
// TODO: Re-enable when World ID 4.0 is live

0 commit comments

Comments
 (0)