Platform notes

How the same-device flow (spec §8) looks on each platform: how a wallet gets the request and the caller's origin, what has been tested, and what hasn't. These notes are not normative; the spec's origin rule TR-2 points here for platform formats.

Android

Chrome on Android hands a Digital Credentials API request to Google Play services, which shows the picker and launches the chosen wallet. The reference Android wallet works like this:

Native Verifier apps

A native app uses the web flow. It opens a page on its own domain in a browser surface, the page runs the client library as any web page would (platform wallets and web wallets alike), and the page hands the checked result back to the app. Wallets bind the response to that page's origin; the app trusts the page because it's the app owner's own domain.

Two ways back carry a result of any size:

Not yet tested on iOS: which in-app browser surface (SFSafariViewController or ASWebAuthenticationSession) offers the Digital Credentials API. Safari itself does.

Calling platform wallets directly on Android

On Android an app can also skip the browser and call platform wallets through CredentialManager.getCredential with a GetDigitalCredentialOption; web wallets aren't reachable this way. Android reports no origin for an app caller, but it gives the Wallet the app's package name and signing certificates. The origin string is then android:apk-key-hash: followed by the base64url SHA-256 of the app's signing certificate TR-2, the format Android's holder documentation, Multipaz, and Google Wallet use. The app computes the same string for its own transcript. The reference Android wallet uses it.

A Wallet can't yet name a native app that calls it, so it says that an app is asking; how Wallets should identify native app callers is still open.

iOS and Safari

Desktop browsers

On a computer, Chrome can offer to continue on a phone by showing a QR code. The phone's wallet answers, and the transcript is bound to the desktop page's origin. The spec leaves cross-device flows out of scope (§1.4), but the messages are the same. This project's automated tests don't cover it.

What has been tested

SetupVersionsHow
Android phone, Chrome, reference walletAndroid 17, Chrome 151, Play services 26.32By hand, including large responses
Android emulator, Chrome, reference wallet, Testing EHRAPI 37 image, Chrome 145, Play services 26.11Nightly in CI; the large-response scenario runs by hand on a phone, since the emulator's Chrome 145 predates the browser's large-response path
Native Android app as Verifier, through a Custom TabAndroid 17, Chrome 145Automated, with the example app and the SMART Testing Wallet
Native Android app as Verifier, directAndroid 17Automated, with the example app
Web wallets in any browserCurrent Chrome and ChromiumAfter every deploy and nightly, by the Testing EHR self-test

The real Chrome-to-Android capture that Appendix A walks through came from the emulator setup above.