From a9cd9acafff196445285274ad84426384b7d0bf5 Mon Sep 17 00:00:00 2001 From: Avner Matan <137777701+avner-m@users.noreply.github.com> Date: Fri, 26 Jun 2026 15:14:18 +1200 Subject: [PATCH 1/5] fix(verifier): use failureType rawValue in iOS verifier sample apps MobileCredentialVerificationFailureType is a String-backed enum and has no member 'message' (message only exists as an internal CodingKey), so 'failureType?.message' fails to compile: Value of type 'MobileCredentialVerificationFailureType' has no member 'message' Use the enum's rawValue, which is the human-readable failure message (e.g. "mDoc authentication failed"). Fixes both the in-person and remote verification tutorial sample apps. --- .../In person verification tutorial/DocumentView.swift | 4 +++- .../Remote verification tutorial/DocumentView.swift | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ios-in-person-verifier-tutorial-sample-app/In person verification tutorial/DocumentView.swift b/ios-in-person-verifier-tutorial-sample-app/In person verification tutorial/DocumentView.swift index b4c9e1b..81191e9 100644 --- a/ios-in-person-verifier-tutorial-sample-app/In person verification tutorial/DocumentView.swift +++ b/ios-in-person-verifier-tutorial-sample-app/In person verification tutorial/DocumentView.swift @@ -117,7 +117,9 @@ class DocumentViewModel { self.docType = presentation.docType self.verificationResult = presentation.verificationResult.verified ? "Verified" : "Invalid" // From v6.0.0, the failure detail is exposed via `failureType` (was `reason`). - self.verificationFailedReason = presentation.verificationResult.failureType?.message + // `MobileCredentialVerificationFailureType` is a String-backed enum; its `rawValue` + // is the human-readable failure message (e.g. "mDoc authentication failed"). + self.verificationFailedReason = presentation.verificationResult.failureType?.rawValue self.namespacesAndClaims = presentation.claims?.reduce(into: [String: [String: String]]()) { result, outerElement in let (outerKey, innerDict) = outerElement diff --git a/ios-remote-verification-tutorial-sample-app/Remote verification tutorial/DocumentView.swift b/ios-remote-verification-tutorial-sample-app/Remote verification tutorial/DocumentView.swift index 005b68b..01280f9 100644 --- a/ios-remote-verification-tutorial-sample-app/Remote verification tutorial/DocumentView.swift +++ b/ios-remote-verification-tutorial-sample-app/Remote verification tutorial/DocumentView.swift @@ -112,7 +112,9 @@ class DocumentViewModel: ObservableObject { self.docType = presentation.docType self.verificationResult = presentation.verificationResult.verified ? "Verified" : "Invalid" // From v6.0.0, the failure detail is exposed via `failureType` (was `reason`). - self.verificationFailedReason = presentation.verificationResult.failureType?.message + // `MobileCredentialVerificationFailureType` is a String-backed enum; its `rawValue` + // is the human-readable failure message (e.g. "mDoc authentication failed"). + self.verificationFailedReason = presentation.verificationResult.failureType?.rawValue self.namespacesAndClaims = presentation.claims?.reduce(into: [String: [String: String]]()) { result, outerElement in let (outerKey, innerDict) = outerElement From 309096c490b237e8c8a4b4ade57d61a928730b8b Mon Sep 17 00:00:00 2001 From: Avner Matan <137777701+avner-m@users.noreply.github.com> Date: Fri, 26 Jun 2026 15:23:51 +1200 Subject: [PATCH 2/5] fix(verifier): add camera and Bluetooth usage descriptions to in-person sample The in-person verifier sample app uses GENERATE_INFOPLIST_FILE with no camera usage description, so the app crashes when tapping 'Scan QR Code': This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSCameraUsageDescription key... Add INFOPLIST_KEY_NSCameraUsageDescription for QR scanning and INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription for the subsequent BLE proximity session (which would otherwise crash on the next step), to both the Debug and Release build configurations. --- .../In person verification tutorial.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ios-in-person-verifier-tutorial-sample-app/In person verification tutorial.xcodeproj/project.pbxproj b/ios-in-person-verifier-tutorial-sample-app/In person verification tutorial.xcodeproj/project.pbxproj index 4180865..a611160 100644 --- a/ios-in-person-verifier-tutorial-sample-app/In person verification tutorial.xcodeproj/project.pbxproj +++ b/ios-in-person-verifier-tutorial-sample-app/In person verification tutorial.xcodeproj/project.pbxproj @@ -265,6 +265,8 @@ DEVELOPMENT_TEAM = ""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "This app uses Bluetooth to connect to the holder's wallet and receive the mDoc during in-person verification."; + INFOPLIST_KEY_NSCameraUsageDescription = "This app uses the camera to scan the QR code that initiates an in-person verification session."; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -297,6 +299,8 @@ DEVELOPMENT_TEAM = ""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "This app uses Bluetooth to connect to the holder's wallet and receive the mDoc during in-person verification."; + INFOPLIST_KEY_NSCameraUsageDescription = "This app uses the camera to scan the QR code that initiates an in-person verification session."; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; From 1cdcd53258b7a5d38c8a59c78e66502ce5637374 Mon Sep 17 00:00:00 2001 From: Avner Matan <137777701+avner-m@users.noreply.github.com> Date: Mon, 29 Jun 2026 13:53:48 +1200 Subject: [PATCH 3/5] feat(verifier): add Constants file to Android in-person sample and read tenant/applicationId from it --- .../java/com/example/verifiertutorial/Constants.kt | 13 +++++++++++++ .../com/example/verifiertutorial/MainActivity.kt | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 android-in-person-verifier-tutorial-sample-app/app/src/main/java/com/example/verifiertutorial/Constants.kt diff --git a/android-in-person-verifier-tutorial-sample-app/app/src/main/java/com/example/verifiertutorial/Constants.kt b/android-in-person-verifier-tutorial-sample-app/app/src/main/java/com/example/verifiertutorial/Constants.kt new file mode 100644 index 0000000..41ddd0a --- /dev/null +++ b/android-in-person-verifier-tutorial-sample-app/app/src/main/java/com/example/verifiertutorial/Constants.kt @@ -0,0 +1,13 @@ +package com.example.verifiertutorial + +// Constants +// These values are specific to your own MATTR VII tenant and to the Verifier +// Application configuration you create within it. +// Replace both placeholders before running a real verification: +// - TENANT_HOST: the base URL of your MATTR VII tenant. +// - APPLICATION_ID: the `id` returned when you create the Verifier Application +// configuration on your tenant. +object Constants { + const val TENANT_HOST = "https://your-tenant.vii.mattr.global" + const val APPLICATION_ID = "" +} diff --git a/android-in-person-verifier-tutorial-sample-app/app/src/main/java/com/example/verifiertutorial/MainActivity.kt b/android-in-person-verifier-tutorial-sample-app/app/src/main/java/com/example/verifiertutorial/MainActivity.kt index f100586..7425cb7 100644 --- a/android-in-person-verifier-tutorial-sample-app/app/src/main/java/com/example/verifiertutorial/MainActivity.kt +++ b/android-in-person-verifier-tutorial-sample-app/app/src/main/java/com/example/verifiertutorial/MainActivity.kt @@ -38,8 +38,8 @@ class MainActivity : ComponentActivity() { // registers this app instance with the tenant and obtains a license, so a PlatformConfiguration // pointing at your tenant and Verifier Application is required. val platformConfiguration = PlatformConfiguration( - tenantHost = URL("https://your-tenant.vii.mattr.global"), - applicationId = "" + tenantHost = URL(Constants.TENANT_HOST), + applicationId = Constants.APPLICATION_ID ) try { // This function initializes storage, registers the app instance, obtains a license, From 8d212330789a3e0cabce4eae6982ee586cff659d Mon Sep 17 00:00:00 2001 From: Avner Matan <137777701+avner-m@users.noreply.github.com> Date: Mon, 29 Jun 2026 14:18:11 +1200 Subject: [PATCH 4/5] chore: gitignore docs/superpowers process artifacts --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 537ab2c..db5cadc 100644 --- a/.gitignore +++ b/.gitignore @@ -92,4 +92,6 @@ README.private.md ###################### .env .env.local -.env.development.local \ No newline at end of file +.env.development.local +# Superpowers process artifacts (specs/plans) - do not commit to product PRs +docs/superpowers/ From d99fe2d085250f0f7a6952eb8e4ebb22f580cca6 Mon Sep 17 00:00:00 2001 From: Avner Matan <137777701+avner-m@users.noreply.github.com> Date: Mon, 29 Jun 2026 16:14:54 +1200 Subject: [PATCH 5/5] fix(verifier): correct PlatformConfiguration import in Android verifier samples The Verifier SDK artifact repackages common sources from global.mattr.mobilecredential.common to global.mattr.mobilecredential.verifier (see Verifier/transform-sources.gradle in android-mobile-credential-sdks), so PlatformConfiguration ships under ...verifier.platformconfig, not ...common. Both Android verifier sample apps used the common import and failed to compile. --- .../src/main/java/com/example/verifiertutorial/MainActivity.kt | 2 +- .../java/com/example/mobileverifiertutorial/MainActivity.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android-in-person-verifier-tutorial-sample-app/app/src/main/java/com/example/verifiertutorial/MainActivity.kt b/android-in-person-verifier-tutorial-sample-app/app/src/main/java/com/example/verifiertutorial/MainActivity.kt index 7425cb7..4d0369e 100644 --- a/android-in-person-verifier-tutorial-sample-app/app/src/main/java/com/example/verifiertutorial/MainActivity.kt +++ b/android-in-person-verifier-tutorial-sample-app/app/src/main/java/com/example/verifiertutorial/MainActivity.kt @@ -21,7 +21,7 @@ import androidx.navigation.compose.rememberNavController import com.example.verifiertutorial.ui.theme.VerifierTutorialTheme import global.mattr.mobilecredential.verifier.dto.MobileCredentialResponse import global.mattr.mobilecredential.verifier.MobileCredentialVerifier -import global.mattr.mobilecredential.common.platformconfig.PlatformConfiguration +import global.mattr.mobilecredential.verifier.platformconfig.PlatformConfiguration import global.mattr.mobilecredential.verifier.exception.VerifierException.FailedToRegisterException import global.mattr.mobilecredential.verifier.exception.VerifierException.InvalidLicenseException import kotlinx.coroutines.launch diff --git a/android-remote-verification-tutorial-sample-app/app/src/main/java/com/example/mobileverifiertutorial/MainActivity.kt b/android-remote-verification-tutorial-sample-app/app/src/main/java/com/example/mobileverifiertutorial/MainActivity.kt index 07fa7fc..12ea0ae 100644 --- a/android-remote-verification-tutorial-sample-app/app/src/main/java/com/example/mobileverifiertutorial/MainActivity.kt +++ b/android-remote-verification-tutorial-sample-app/app/src/main/java/com/example/mobileverifiertutorial/MainActivity.kt @@ -29,7 +29,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.example.mobileverifiertutorial.ui.theme.MobileVerifierTutorialTheme import global.mattr.mobilecredential.verifier.MobileCredentialVerifier import global.mattr.mobilecredential.verifier.OnlinePresentationSessionResult -import global.mattr.mobilecredential.common.platformconfig.PlatformConfiguration +import global.mattr.mobilecredential.verifier.platformconfig.PlatformConfiguration import global.mattr.mobilecredential.verifier.deviceretrieval.devicerequest.DataElements import global.mattr.mobilecredential.verifier.deviceretrieval.devicerequest.NameSpaces import global.mattr.mobilecredential.verifier.dto.MobileCredentialPresentation