Android Verifier SDK v7.0.0 Migration Guide
A comprehensive guide to migrating to Android Verifier SDK v7.0.0, covering breaking changes, new features, and step-by-step migration instructions.
Overview
This guide provides a comprehensive overview of the changes introduced in the Android Verifier SDK v7.0.0, including breaking changes, new features, and migration steps.
This release focuses on strengthening trust between your verifier application and your MATTR VII tenant, improving consistency across platforms, and making verification results more predictable. The headline change is SDK Tethering, which becomes required in this release: every SDK and app instance is now registered with, and licensed by, your MATTR VII tenant at initialization.
Unlike the Holder SDK, where SDK Tethering is optional, SDK Tethering is required for the Verifier
SDK from v7.0.0. This builds on an existing requirement — remote mobile (app-to-app) verification
already required you to supply a platformConfiguration so the SDK could reach your MATTR VII tenant
to handle the backend verification. That platformConfiguration is now mandatory for all
initializations and additionally drives SDK Tethering.
Key Features
- SDK Tethering (required): The Android Verifier SDK is now tethered to a MATTR VII tenant, tying
each SDK/app instance to your tenant. On first initialization the SDK registers the app instance
with the tenant specified in
PlatformConfigurationand obtains a license; on subsequent initializations the existing license is renewed automatically. This lets you view registered and active app instances directly from your tenant for operational insight, and establishes a remote management channel we expect to extend in future releases (for example, remote syncing of trusted issuer lists and eventing). The SDK uses Key Attestation during app registration. Network access is required when registration or renewal is performed. - Cross-platform alignment: Verification result types and the revocation status list API have been renamed and restructured to align with the iOS Verifier SDK, minimizing divergence for teams maintaining cross-platform applications.
- More predictable session results:
OnlinePresentationSessionResultand the revocation status list refresh result are now sealed interfaces with explicitSuccessandFailurevariants, removing ambiguity from result handling. - Simpler remote mobile configuration: The application ID for remote mobile (app-to-app)
verification is now taken from
PlatformConfiguration, so it no longer needs to be passed on every request. - General stability and performance improvements: Multiple refinements reduce integration friction, increase consistency, and improve overall reliability.
Breaking Changes
This section outlines the breaking changes introduced in v7.0.0 that require updates to your existing implementation:
| # | Change | Impact |
|---|---|---|
| 1 | SDK Tethering is now required: PlatformConfiguration is mandatory on initialize, which now also registers the app instance and obtains a license | Always supply a PlatformConfiguration. Handle the new InvalidLicenseException and FailedToRegisterException, which can be thrown by initialize and by most SDK APIs. |
| 2 | MobileCredentialVerifier.updateTrustedIssuerStatusLists renamed to refreshRevocationStatusLists | Update all references to the new method name. |
| 3 | MobileCredentialVerifier.getTrustedIssuerStatusListsCacheInfo renamed to getRevocationStatusListsCacheInfo | Update all references to the new method name. |
| 4 | TrustedIssuerStatusListsCacheInfo renamed to RevocationStatusListsCacheInfo | Update all code that constructs or references this type. |
| 5 | UpdateTrustedIssuerStatusListsResult renamed to RevocationStatusListsRefreshResult and converted to a sealed interface; the .success: Boolean field is removed | Replace if (result.success) with when/is pattern matching over Success and Failure. |
| 6 | OnlinePresentationSessionResult converted to a sealed interface with Success and Failure variants | Replace field-based branching with when/is pattern matching. |
| 7 | MobileCredentialResponse.credentials and MobileCredentialResponse.credentialErrors are now required non-nullable List fields | Remove null-check branches and ?. navigation; both arguments must be provided at construction. |
| 8 | applicationId parameter removed from requestMobileCredentials (remote mobile, app-to-app) | Remove the applicationId argument and supply it via PlatformConfiguration instead. |
Migration Steps
Create a verifier application on your MATTR VII tenant
SDK Tethering requires a verifier application configured on the MATTR VII tenant your SDK connects to. If you already use remote mobile (app-to-app) verification you will have created one; the same application is reused for tethering. If you have not, create one now.
To register your Android application, make a request to create a verifier application:
POST /v2/presentations/applications{
"name": "My Android Verifier Application",
"type": "android",
"packageName": "com.yourcompany.verifierapp",
"packageSigningCertificateThumbprints": [
"1232584b6f6a892d356899fb9576c5f226a179e6199f2b7a1d837b5c234c5a8e"
]
}name: A unique name to identify your verifier application.type: Must beandroidfor an Android application.packageName: The package name of your Android application.packageSigningCertificateThumbprints: SHA-256 hex-encoded fingerprints of the signing key certificates used to sign your APK or app bundle. This ensures the tenant only accepts requests from known and trusted applications. Refer to Android app signing for more information.
The response will include a unique id for your application, used by the SDK to identify and
authenticate your application.
Supply PlatformConfiguration and handle tethering errors at initialization
PlatformConfiguration is now required on initialize. Previously it was optional and only used for
remote mobile (app-to-app) verification flows; it now also drives SDK Tethering, registering the app
instance with your MATTR VII tenant and obtaining a license on first initialization.
Always pass a PlatformConfiguration, and handle the new InvalidLicenseException and
FailedToRegisterException that initialize can now throw:
- val platformConfiguration = PlatformConfiguration(
- tenantHost = URL("https://your-tenant.vii.mattr.global")
- )
- MobileCredentialVerifier.initialize(context, platformConfiguration)
+ val platformConfiguration = PlatformConfiguration(
+ tenantHost = URL("https://your-tenant.vii.mattr.global"),
+ applicationId = "1ef1f867-20b4-48ea-aec1-bea7aff4964c"
+ )
+ try {
+ MobileCredentialVerifier.initialize(context, platformConfiguration)
+ } catch (e: FailedToRegisterException) {
+ // Registration with the MATTR VII tenant failed — check connectivity and configuration
+ } catch (e: InvalidLicenseException) {
+ // The SDK license is missing, invalid, or expired
+ }tenantHost: The URL of your MATTR VII tenant where your verifier application is configured.applicationId: Theidof your configured MATTR VII verifier application.
The majority of the SDK's other APIs can now also throw InvalidLicenseException when a valid
license is not present. Network access is required the first time the SDK initializes (for
registration) and when the license is renewed on subsequent initializations. Update your error
handling, logging, analytics, and support diagnostics to account for these cases.
Remove the applicationId argument from requestMobileCredentials
MobileCredentialVerifier.requestMobileCredentials (remote mobile, app-to-app) no longer takes an
applicationId parameter. It now uses the application ID supplied in PlatformConfiguration during
initialization. Remove the argument from your call sites:
val result = verifier.requestMobileCredentials(
request = listOf(mobileCredentialRequest),
challenge = challenge,
- applicationId = "your-application-id"
)Ensure you provide applicationId via PlatformConfiguration (see the previous step) instead.
Update revocation status list method and type names
The revocation status list management API has been renamed from TrustedIssuer-prefixed terminology
to Revocation terminology to better reflect its purpose — managing the lists used to check the
revocation status of credentials. Update all call sites:
- val result = verifier.updateTrustedIssuerStatusLists()
+ val result = verifier.refreshRevocationStatusLists()
- val cacheInfo = verifier.getTrustedIssuerStatusListsCacheInfo()
+ val cacheInfo = verifier.getRevocationStatusListsCacheInfo()| Old | New |
|---|---|
updateTrustedIssuerStatusLists() | refreshRevocationStatusLists() |
getTrustedIssuerStatusListsCacheInfo() | getRevocationStatusListsCacheInfo() |
TrustedIssuerStatusListsCacheInfo | RevocationStatusListsCacheInfo |
UpdateTrustedIssuerStatusListsResult | RevocationStatusListsRefreshResult |
Update revocation status list refresh result handling
RevocationStatusListsRefreshResult (formerly UpdateTrustedIssuerStatusListsResult) has been
converted from a data class to a sealed interface with Success and Failure variants, and the
.success: Boolean field has been removed. Replace boolean branching with when/is pattern
matching:
- val result = verifier.refreshRevocationStatusLists()
- if (result.success) {
- // Handle success
- } else {
- // Handle failure
- }
+ when (val result = verifier.refreshRevocationStatusLists()) {
+ is RevocationStatusListsRefreshResult.Success -> {
+ // Handle successful refresh
+ }
+ is RevocationStatusListsRefreshResult.Failure -> {
+ // result.failedLists is available here
+ }
+ }Update online presentation session result handling
OnlinePresentationSessionResult has been converted from a data class to a sealed interface with
Success and Failure variants. Replace field-based branching with when/is pattern matching:
- val result = ... // OnlinePresentationSessionResult
- if (result.mobileCredentialResponse != null) {
- // Use result.mobileCredentialResponse
- } else {
- // Use result.error
- }
+ when (result) {
+ is OnlinePresentationSessionResult.Success -> {
+ // result.mobileCredentialResponse is guaranteed
+ }
+ is OnlinePresentationSessionResult.Failure -> {
+ // result.error is guaranteed
+ }
+ }Remove optional handling on MobileCredentialResponse collections
MobileCredentialResponse.credentials and MobileCredentialResponse.credentialErrors are now
required non-nullable List fields, instead of nullable fields. Remove null checks and ?.
navigation, and provide both arguments when constructing the type:
- for (credential in response.credentials.orEmpty()) { ... }
+ for (credential in response.credentials) { ... }How would you rate this page?
Last updated on