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/ 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..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 @@ -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, 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 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; 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