Remote mobile verification quickstart guide
This quickstart is for evaluating the MATTR Pi mDocs Mobile Verifier SDKs. In about 15-20 minutes you will configure a MATTR VII verifier tenant, run a sample verifier mobile app (iOS, Android, or React Native) on a physical device, and use it to verify an mDoc presented from a wallet application on the same device using the remote presentation workflow defined by OID4VP and ISO/IEC 18013-7:2025 Annex B.
This is an app-to-app flow. The verifier app invokes a separate wallet app installed on the same device to request the credential, and the wallet returns the presentation to the verifier. It is not the browser-based Digital Credentials API flow: both apps run on the same physical device and exchange the OID4VP request and response directly between each other.
Estimated time: 15-20 minutes. This covers the verifier setup and verification flow. If you are using the sample holder app, allow additional 10-15 minutes to build and run it from the Holder SDK quickstart guide, which you need before Part 3.
Use this guide as a fast evaluation path to see the Mobile Verifier SDK working end-to-end on a real device. For detailed information and API examples, explore the tutorial and reference documentation tailored for each platform.
User experience
In this quickstart you will perform this exact flow yourself using a MATTR VII verifier tenant, the sample verifier app, and a wallet that supports remote presentation acting as the holder:
- A relying party uses the Mobile Verifier SDK to embed a remote verification workflow into a mobile application.
- When a user interacts with the mobile application, a matching wallet application installed on their mobile device is invoked to request an mDoc for verification.
- The user consents to sharing the requested information.
- The user's wallet application shares the matching mDoc with the MATTR VII tenant configured by the Mobile Verifier SDK to perform the verification workflow.
- The MATTR VII tenant performs the required checks and returns the verification results via the Mobile Verifier SDK to the verifier application.
- The user journey continues based on the verification results.
Prerequisites
- Use the Get Started form to request a trial of MATTR verification capabilities. You will receive access to the following resources:
- MATTR Pi mDocs Verifier SDK for your chosen platform (iOS, Android, or React Native).
- MATTR VII tenant.
- A physical mobile device to run the verifier app, with a wallet that supports remote presentation as per ISO/IEC 18013-7 and OID4VP installed on the same device. You can build and run the sample holder app from the Holder SDK quickstart guide.
- Development environment set up for your chosen platform (Xcode for iOS, Android Studio for Android, or a React Native / Expo development environment with Node.js 18+).
Steps
In this quickstart you will:
- Configure a MATTR VII verifier tenant to handle the verification requests.
- Download, configure, and run a local sample verifier project for your platform.
- Claim a test credential into a wallet on the same device and verify it remotely.
- Review the structure of the sample project so you can see how to integrate the SDK into your own app.
Use the tabs below to follow platform-specific setup steps.
Part 1: Configure the MATTR VII verifier tenant (5 minutes)
These steps configure your verifier tenant so the sample verifier app can request and verify mDocs issued by a trusted issuer.
Create a MATTR VII tenant
If you already have a tenant you can skip this step.
- Log into the MATTR Portal.
- Select the Create/switch tenant button on the top-right side of the screen.
The All tenants panel is displayed, listing any existing tenants. - Select the Create new button.
The New tenant form is displayed. - Use the Region dropdown list to select the region your tenant will be hosted in.
- Use the Tenant subdomain text box to insert a subdomain for your tenant (e.g.
remote-mobile-verification). - Select the Create button to create the new tenant.
- Copy the displayed tenant information (
audience,auth_url,tenant_url,client_idandclient_secret) which is required for the next step.
Create a verifier application configuration
Create a Verifier Application in the MATTR Portal so the Mobile Verifier SDK can connect to your MATTR VII tenant and request credential presentations:
- Log in to the MATTR Portal and expand the Credential verification section in the left-hand navigation panel.
- Select Applications, then select the Create new button.
- Use the Name text box to insert a meaningful and friendly name for your application.
- Use the Type radio button to select iOS.
- Use the Team ID text box to insert your Apple Developer Team ID, found in the "Membership details" of your Apple Developer account.
- Use the Bundle ID text box to insert the Bundle ID (
CFBundleIdentifier) of the iOS app you will create in the next step. - Leave the App Attest toggle set to Inactive for this quickstart.
- Use the Allowed presentation method radio button to select Remote and in-person.
- Configure the OID4VP settings for the remote presentation flow by setting the OID4VP redirect URI
the user is returned to after the wallet presents the credential. Structure it using your app's
custom URL scheme (for example,
com.yourname.mobileverifier://oid4vp-callback). - Leave Max time offline at its default value.
- Select the Create button to create the application and display its detail screen.
- Copy and record the
IDvalue. You must use it when initializing the SDK so that it can correctly identify and authenticate your application.
Create a supported wallet configuration
This defines the URI scheme the MATTR VII tenant uses to invoke the wallet application as part of the remote verification workflow.
- Log into your MATTR VII tenant in the MATTR Portal.
- Expand the Credential Verification menu in the left-hand navigation panel.
- Select Supported wallets.
- Select Create new.
- Enter a meaningful Name for the supported wallet (e.g. "My Supported Wallet").
- Enter
mdoc-openid4vp://in the Authorization Endpoint field. This is the default OID4VP scheme used to invoke the wallet application. - Select Create.
More information on applying different URI schemes and the resulting user experience can be found on the workflow page.
Configure a trusted issuer
In this quickstart you will add a MATTR-provided demo issuer certificate so your verifier accepts mDocs issued by this issuer.
- Select Trusted issuers under the Credential Verification menu.
- Select Create new.
- Copy and paste the following certificate into the Certificate PEM file field:
-----BEGIN CERTIFICATE-----
MIICYzCCAgmgAwIBAgIKXhjLoCkLWBxREDAKBggqhkjOPQQDAjA4MQswCQYDVQQG
EwJBVTEpMCcGA1UEAwwgbW9udGNsaWZmLWRtdi5tYXR0cmxhYnMuY29tIElBQ0Ew
HhcNMjQwMTE4MjMxNDE4WhcNMzQwMTE1MjMxNDE4WjA4MQswCQYDVQQGEwJBVTEp
MCcGA1UEAwwgbW9udGNsaWZmLWRtdi5tYXR0cmxhYnMuY29tIElBQ0EwWTATBgcq
hkjOPQIBBggqhkjOPQMBBwNCAASBnqobOh8baMW7mpSZaQMawj6wgM5e5nPd6HXp
dB8eUVPlCMKribQ7XiiLU96rib/yQLH2k1CUeZmEjxoEi42xo4H6MIH3MBIGA1Ud
EwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRFZwEOI9yq
232NG+OzNQzFKa/LxDAuBgNVHRIEJzAlhiNodHRwczovL21vbnRjbGlmZi1kbXYu
bWF0dHJsYWJzLmNvbTCBgQYDVR0fBHoweDB2oHSgcoZwaHR0cHM6Ly9tb250Y2xp
ZmYtZG12LnZpaS5hdTAxLm1hdHRyLmdsb2JhbC92Mi9jcmVkZW50aWFscy9tb2Jp
bGUvaWFjYXMvMjk0YmExYmMtOTFhMS00MjJmLThhMTctY2IwODU0NWY0ODYwL2Ny
bDAKBggqhkjOPQQDAgNIADBFAiAlZYQP95lGzVJfCykhcpCzpQ2LWE/AbjTGkcGI
SNsu7gIhAJfP54a2hXz4YiQN4qJERlORjyL1Ru9M0/dtQppohFm6
-----END CERTIFICATE------ Select Add.
Part 2: Configure and run the sample verifier app (5-10 minutes)
In this section you will download, configure, and run a sample verifier app that uses the Mobile Verifier SDK. This sample app is the completed result of the remote mobile verification tutorial.
-
Access the sample verifier codebase by either:
-
Cloning the MATTR Sample Apps repository:
Clone sample apps git clone https://github.com/mattrglobal/sample-apps.git -
Or downloading just the iOS sample verifier project using download-directory.github.io.
-
-
Use Xcode to open the
.xcodeprojfile in the project's folder. You can find it in thesample-apps/ios-remote-verification-tutorial-sample-appdirectory. -
Drag the
MobileCredentialVerifierSDK.xcframeworkfolder (obtained from MATTR as part of the SDK package) into your project. -
Configure
MobileCredentialVerifierSDK.xcframeworkto Embed & sign. -
Set the bundle identifier you entered in Part 1 for the project in the Xcode project settings (e.g.
com.yourname.mobileverifier). -
Open the
Constantsfile and update it with your tenant and application details:Constants enum Constants { static let tenantHost = URL(string: "https://your-tenant.vii.mattr.global")! static let applicationID = "your-application-id" }tenantHost: Replace with the URL of your MATTR VII tenant, available in the MATTR Portal under Platform Management > Tenant.applicationID: Replace with theidreturned when you created the verifier application in Part 1.
-
Run the project on a physical iOS device.
Part 3: Claim and verify a credential (5 minutes)
Claim a credential to present
To test the verification flow, you need a compatible mDoc in a wallet that supports remote presentation on the same device as the verifier app. Use the sample holder app you build with the Holder SDK quickstart guide to claim a demo mDL credential issued by the MATTR demo issuer you added as a trusted issuer in Part 1.
- Build and run the sample holder app on the device running the sample verifier app, following Part 1 of the Holder SDK quickstart guide.
- In the sample holder app, select Claim Credential (you may need to allow the app to access your camera).
- Scan the following QR code:

- Follow the on-screen instructions to claim the credential into the sample holder app.
This credential will be used in the next step when you test the remote verification flow.
Verify the credential
- Launch the sample verifier app and select Request credentials.
- You will be redirected to the sample holder app, which displays what information is requested for verification.
- Select the credential you claimed in the previous step and consent to sharing the requested information.
- You will be redirected back to the sample verifier app, which displays the verification results.
Behind the scenes, the Mobile Verifier SDK started a presentation session with your MATTR VII tenant, invoked the wallet, and surfaced the verification results returned by the tenant according to OID4VP and ISO/IEC 18013-7:2025 Annex B.
Review the codebase
The sample verifier application uses the Mobile Verifier SDK to verify mDocs presented remotely from a wallet on the same device. Once you have the sample application running, use this section to inspect the key SDK calls you will reuse in your own application.
Initialize the SDK
The SDK is initialized with your tenant host configuration so it knows which MATTR VII tenant to interact with.
let platformConfiguration = PlatformConfiguration(
tenantHost: URL(string: "https://your-tenant.vii.mattr.global")!,
applicationId: "your-application-id"
)initialize is asynchronous from v6.0.0 (call it from an asynchronous context). It registers the app instance with your tenant and obtains a license, so it can throw failedToRegister and invalidLicense:
mobileCredentialVerifier = MobileCredentialVerifier.shared
try await mobileCredentialVerifier.initialize(platformConfiguration: platformConfiguration)tenantHost: URL of your MATTR VII tenant.applicationId: Theidreturned when you created the verifier application configuration. Supplied here viaPlatformConfiguration(no longer passed torequestMobileCredentials) and used for the SDK Backend.
Create a presentation request
A presentation request defines the type of credential and the specific data elements being requested for verification.
let mobileCredentialRequest = MobileCredentialRequest(
docType: "org.iso.18013.5.1.mDL",
namespaces: [
"org.iso.18013.5.1": [
"family_name": false,
"given_name": false,
"birth_date": false
]
]
)docType: The type of credential being requested (e.g.org.iso.18013.5.1.mDL).namespaces: A dictionary mapping each namespace to its requested attributes. Each attribute is a key with a Boolean indicating whether the verifier intends to retain this attribute (true) or not (false).
Request credentials from the wallet application
This starts a presentation session with the MATTR VII tenant and redirects the user to a matching wallet application.
let onlinePresentationResult = try await mobileCredentialVerifier.requestMobileCredentials(
request: [mobileCredentialRequest]
)request: Array ofMobileCredentialRequestobjects defining what information to request.
From v6.0.0, the applicationId is no longer passed here — it comes from the PlatformConfiguration you set when initializing the SDK. The challenge parameter is now optional: omit it to let the SDK generate a secure challenge, or pass your own unique value per session to mitigate replay attacks.
Handle the redirect from the wallet
After the wallet presents the credential, the user is redirected back to the verifier app via the custom URL scheme configured for the sample app in Part 2.
.onOpenURL { url in
// Navigate to response screen
viewModel.navigationPath.append(NavigationState.viewResponse)
viewModel.mobileCredentialVerifier.handleDeepLink(url)
}Add this modifier to your SwiftUI view to navigate to the response screen and pass the redirect URL
to the SDK's handleDeepLink method. The SDK processes the response and updates the
receivedDocuments variable with the verification results.
Handle the presentation response
The
requestMobileCredentials
method returns an OnlinePresentationSessionResult object containing the presentation details, any
errors encountered, and the verification status of the credentials. The sample app reads the
credentials from this result, stores them, and renders them in a dedicated view.
From v6.0.0, OnlinePresentationSessionResult is a @frozen enum with success and failure
cases, so you branch over it with switch/case instead of inspecting nullable fields:
switch onlinePresentationResult {
case .success(_, _, let mobileCredentialResponse):
receivedDocuments = mobileCredentialResponse?.credentials ?? []
case .failure(_, _, let error):
print("No response received: \(error.message)")
return
}success: CarriessessionId,challenge, and an optionalmobileCredentialResponsecontaining the verified credentials and their claims.failure: CarriessessionId,challenge, and anerror(typeandmessage) describing what went wrong.credentials: A list of presented credentials with their data, status, and verification results.
The sample app assigns the result to the receivedDocuments variable, which a DocumentView then
renders. A DocumentViewModel converts each MobileCredentialPresentation (docType, verification
result, claims, and claim errors) into a human-readable format for display.
Next steps
- For your evaluation:
- Note how long it took to configure the tenant, run the sample app, and complete a remote verification.
- Consider how the sample's presentation request and result handling map to your real verification use cases (for example, which attributes you would request and how you would display them).
- Explore the detailed tutorial for step-by-step implementation guidance.
- Review the SDK reference documentation for your platform:
- Learn more about the remote verification workflow.
How would you rate this page?
Last updated on