Apple Wallet ID Setup And Testing Guide
Setup and testing guide for using Apple Wallet IDs with the Incode iOS SDK.
Apple Wallet mDL - Integration Guide
Apple Wallet verification lets a user share approved identity attributes from a supported identity credential in Apple Wallet instead of photographing a physical document. The SDK presents Apple's system authorization sheet, sends the encrypted Wallet response to Incode for validation, and then continues the onboarding flow.
Important: Incode must enable Apple Wallet for your account and provide an SDK build that exposes
addIdScan(appleWalletRequestedFields:). Contact your Incode representative before starting the integration.
Requirements
Before integrating Apple Wallet, confirm all of the following:
| Requirement | Details |
|---|---|
| Incode enablement | Incode has enabled Apple Wallet for the account and environment |
| SDK | An Incode-provided build that includes appleWalletRequestedFields |
| Device | An eligible iPhone with a supported identity credential in Apple Wallet |
| OS | iOS 16.0+ for the SDK feature; the credential itself may require a newer iOS version |
| App ID | Apple has granted Verify with Wallet access for the exact bundle ID |
| Signing | The installed build uses a provisioning profile containing both identity-presentment entitlements |
| Merchant ID | The app entitlement, SDK configuration, and Incode environment use the same merchant ID |
| Privacy | NSIdentityUsageDescription is present in the host app's Info.plist |
| Flow | The ID document chooser is enabled and at least one supported Wallet field is configured |
The IncdOnboarding SDK generally supports iOS 13.0+, but Apple Wallet identity verification has a higher minimum. The current SDK implementation uses PassKit APIs available from iOS 16.0 and supports compatible identity credentials on iPhone.
Apple credential availability
Apple controls the minimum device and OS for each credential. These requirements can change, so verify them on Apple's Verify with Wallet page before planning a rollout.
| Credential | Apple minimum on iPhone | Incode iOS scope |
|---|---|---|
| Most supported US driver's licenses and state IDs | iPhone 8 or later, iOS 16.5+ | Supported mDL scope |
| California driver's license or state ID | iPhone XS or later, iOS 17.5+ | Supported mDL scope |
| Puerto Rico driver's license or ID | iPhone XS or later, iOS 18.1+ | Supported mDL scope |
| Japan My Number Card | iPhone XS or later, iOS 18.5+ | Coming Soon |
| Digital ID created from a US passport | iPhone 11 or later, iOS 26.1+ | Supported |
| Personal Identification Data (PID) | Varies by issuer and region | Supported |
Prepare the app
- Ask Incode Support to enable Apple Wallet for the correct account and environment. Obtain the merchant ID and an SDK build that contains the required API.
- Complete Apple's Verify with Wallet entitlement process for the app's bundle ID. Entitlement approval is granted per bundle ID.
- Add the identity-presentment capabilities to the App ID, associate the approved merchant ID, and regenerate the provisioning profile.
- Add the entitlements and
NSIdentityUsageDescriptionshown in Configure the host app. - Configure the same merchant ID on
IncdOnboardingManager.sharedbefore starting onboarding. - Enable Apple Wallet in the ID Capture configuration and request only fields approved by Apple and enabled by Incode.
- Install the correctly signed app on an eligible iPhone containing a compatible identity credential, start onboarding, and choose Apple Wallet from the document chooser.
- Approve the system sheet with Face ID or Touch ID. On success, the SDK submits the encrypted response and continues the configured onboarding flow.
Integration overview
The current integration is chooser-based:
- Your app initializes IncdOnboarding and starts a session.
- The ID Capture module displays the document chooser.
- The user selects Apple Wallet.
- The SDK requests a one-time challenge from Incode.
- The SDK builds a
PKIdentityRequestwith the challenge, merchant ID, and configured identity elements. - Apple displays the system authorization sheet. The user reviews the requested information and authorizes with Face ID or Touch ID.
- PassKit returns an HPKE-encrypted CBOR payload. The SDK treats it as opaque data and sends it to Incode.
- Incode decrypts and validates the response on the server. The ID Capture module completes and the onboarding flow continues.
The host app does not receive raw Wallet identity attributes through a dedicated client callback. Results remain part of the Incode session and its configured verification flow.
The SDK marks the requested elements with Apple's mayStore intent. Make sure the fields you request and the retention described in your privacy policy match your approved use case.
Configure Incode
Ask Incode Support to configure the following for each environment:
- Enable Digital IDs and the Apple Wallet method for ID Capture.
- Enable the identity fields required by the use case.
- Configure the merchant ID and server-side identity certificate used to validate the encrypted response.
- Confirm that the merchant ID belongs to the same environment used by the SDK session.
Do not copy a merchant ID from a sample or another environment. A mismatch between the app, provisioning profile, and Incode server configuration prevents the Wallet response from being validated.
For Dashboard-defined flows, Incode supplies the enabled Apple Wallet method and requested fields through the ID Capture configuration. For code-defined flows, also pass the requested fields to addIdScan(appleWalletRequestedFields:) as shown below.
Configure the host app
Apple Developer account
Follow Apple's environment configuration process:
- Request access to Verify with Wallet for your exact bundle ID.
- Create or select the merchant ID coordinated with Incode.
- Create the required Identity Access Certificate in coordination with Incode's server configuration.
- Add In App Identity Presentment to the App ID.
- Add In App Identity Presentment Merchant IDs and select the merchant ID.
- Generate and install a new provisioning profile.
Entitlements
The app target must contain both identity-presentment entitlements. Include only document types and elements Apple approved for the app. This example shows a typical US mDL subset; replace the merchant placeholder with the value supplied for your environment.
<key>com.apple.developer.in-app-identity-presentment</key>
<dict>
<key>document-types</key>
<array>
<string>us-drivers-license</string>
</array>
<key>elements</key>
<array>
<string>given-name</string>
<string>family-name</string>
<string>date-of-birth</string>
<string>portrait</string>
<string>document-number</string>
<string>document-expiration-date</string>
<string>issuing-authority</string>
</array>
</dict>
<key>com.apple.developer.in-app-identity-presentment.merchant-identifiers</key>
<array>
<string>merchant.your-company.identity</string>
</array>The Apple Pay entitlement com.apple.developer.in-app-payments does not replace the identity-presentment merchant entitlement.
Privacy usage description
Add a user-facing explanation to the host app's Info.plist:
<key>NSIdentityUsageDescription</key>
<string>We use information from your ID in Apple Wallet to verify your identity.</string>Use wording that accurately describes your app's purpose and data handling. Calling the Wallet identity API without this key causes iOS to terminate the app.
Merchant configuration
Set the merchant ID before starting the onboarding session:
IncdOnboardingManager.shared.appleWalletMerchantID =
"merchant.your-company.identity"The value must exactly match an entry in com.apple.developer.in-app-identity-presentment.merchant-identifiers and the merchant configured by Incode for the active environment.
Add Apple Wallet to ID Capture
For a code-defined flow, pass a non-empty list of requested fields and keep the ID type chooser enabled:
let flowConfiguration = IncdOnboardingFlowConfiguration()
flowConfiguration.addIdScan(
scanStep: .both,
showIdTypeChooser: true,
appleWalletRequestedFields: [
"given_name",
"family_name",
"birth_date",
"document_number",
"expiry_date",
"portrait"
]
)appleWalletRequestedFields has the following configuration behavior:
nildisables Apple Wallet.- A non-empty array enables Apple Wallet in the document chooser on iOS 16.0+.
- An empty array is an invalid configuration. Debug builds assert; optimized builds treat it as disabled.
showIdTypeChooser: falsehides the chooser and therefore prevents the current Apple Wallet flow from being initiated.
Requested fields
Every requested field must satisfy three conditions:
- The field is enabled in the Incode ID Capture configuration.
- The SDK maps it to an Apple
PKIdentityElement. - The host app's Apple entitlement and provisioning profile authorize the corresponding element.
The SDK maps these field names. The availability column also identifies fields whose entitlement and end-to-end backend validation are still being finalized:
| Incode requested field | Apple identity element | Availability |
|---|---|---|
given_name | Given name | iOS 16.0+ |
family_name | Family name | iOS 16.0+ |
birth_date | Date of birth | iOS 16.0+ |
issue_date, document_issue_date | Document issue date | iOS 16.0+ |
portrait | Portrait | iOS 16.0+ |
document_number | Document number | iOS 16.0+ |
expiry_date | Document expiration date | iOS 16.0+ |
issuing_authority | Issuing authority | iOS 16.0+ |
driving_privileges, domestic_driving_privileges | Driving privileges | iOS 16.0+ |
resident_address, resident_city, resident_state, resident_postal_code, resident_country | Address | iOS 16.0+ |
age_in_years | Age in years | iOS 16.0+ |
age_over_18 | Age threshold 18 | Final validation in progress; iOS 16.0+ |
age_over_21 | Age threshold 21 | Final validation in progress; iOS 16.0+ |
sex | Sex | Entitlement validation in progress; iOS 17.2+ |
dhs_compliance | DHS compliance status | Entitlement validation in progress; iOS 17.2+ |
height, weight, eye_colour, hair_colour, veteran | Matching physical or status element | Coming Soon; iOS 26.0+ and a compatible SDK build |
birth_place, nationality, signature_usual_mark | Matching identity element | Coming Soon; iOS 26.4+ and a compatible SDK build |
The SDK ignores unknown fields, fields unavailable on the current OS, and fields excluded from the SDK build. It logs the ignored field name and continues if at least one supported element remains. If no supported elements remain, the SDK shows the generic Wallet failure screen.
Current limitation:
issuing_countrydoes not currently have a requester mapping and is ignored. The final mapping and entitlement matrix for this and other extended fields is Coming Soon. Contact Incode Support before requesting a field not listed above.
The client uses Apple's privacy-preserving threshold elements for age_over_18 and age_over_21, but their final end-to-end validation is still in progress. Once Incode confirms them for your environment, prefer a threshold over age_in_years when the exact age is unnecessary.
Cancellation and errors
The current integration does not expose a Wallet-specific public error callback. Errors remain inside the chooser experience so the user can retry or select document capture instead.
| Situation | Current SDK behavior | What to check |
|---|---|---|
| User cancels Apple's authorization sheet | Returns to the document chooser without reporting an error to the integrator | No action is required |
| Apple Wallet option is absent | The chooser omits Wallet | Incode enablement, non-empty requested fields, showIdTypeChooser, and iOS 16.0+ |
| Wallet option is shown but no compatible identity credential is present | PassKit can reject the request and the SDK shows its generic retry screen | Device and credential eligibility |
| App terminates with an entitlement error | iOS rejects the PassKit API call | Bundle ID approval, signed entitlements, and regenerated provisioning profile |
| App terminates with a privacy usage-description error | iOS rejects the PassKit API call | Add NSIdentityUsageDescription to the host app |
appleWalletMerchantID is missing | The SDK shows its generic Wallet retry screen | Set the manager property before starting onboarding |
| Merchant or challenge validation fails | The SDK shows its generic Wallet retry screen | Merchant ID must match the entitlement and the Incode environment; confirm network access |
| A requested field is logged as unsupported | The SDK skips that field | Use the supported field table and verify the device OS and SDK build |
| Every requested field is unsupported | The SDK cannot create the request and shows its generic Wallet retry screen | Configure at least one supported, entitled field |
| Apple authorization fails | The SDK shows its generic Wallet retry screen | Compatible ID, requested entitlements, merchant ID, network, and whether another identity request is active |
| Encrypted response validation or upload fails | The SDK shows its generic Wallet retry screen | Confirm Incode environment enablement and merchant/certificate configuration with Support |
PassKit diagnostic errors may include cancelled, invalidElement, invalidNonce, notSupported, networkUnavailable, noElementsRequested, requestAlreadyInProgress, and unknown. The current SDK handles cancelled by returning to the chooser; the other categories use the generic retry experience and are not returned as a public IncdError.
When contacting Support, include the SDK version, app bundle ID, iOS/device version, Incode session identifier, approximate timestamp, and whether the failure occurred before or after Apple's authorization sheet. Do not include raw identity data.
Related documentation
- IncdOnboarding SDK Usage
- SDK Installation and Setup
- Apple: Get started with Verify with Wallet
- Apple: Configure the Verify with Wallet environment
- Apple:
PKIdentityAuthorizationController
License
Copyright 2026 Incode Technologies. All rights reserved.
Updated about 20 hours ago
