Verify App Links on Android 12 and higher
App links is a topic that an Android developer must be working on, but have you ever run into the weird scenario where, after configuration was completed, you self-test on a device and a simulator, and everything is good, till the tester reopens the task because the app link is not working on their device. LoL! And I still try to show evidence that it’s working right!!! 🤭🤭🤭
And here are some tips to solve the problem:
I. Find the root cause
1. Recognize: the device that cannot open App links: Samsung A71 Android 12
2. Check config code:
- Check config on
AndroidManifest.xml
file
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Ex URIs "http://app-link.com/demo?id=255” -->
<data
android:host="app-link.com"
android:scheme="http" />
</intent-filter>
- Check the handling intent on
MainActivity.kt
private fun handleIntent(intent: Intent) {
val appLinkAction = intent.action
val appLinkData: Uri? = intent.data
if (Intent.ACTION_VIEW == appLinkAction) {
appLinkData?.lastPathSegment?.also { lastPath ->
when (lastPath) {
"demo" -> {
appLinkData.getQueryParameter("id")?.also {
//Handle logic
findViewById<TextView>(R.id.tvContent).text=
"Data get from App link ID = $it"
}
}
}
}
}
}
This is a sample project with a single activity that has a TextView to display a message.
As you can see, the flow app works right on Android 11. But with Android 12…no action when I click on the link, and why?
After finding the cause of the problem - why Android 12 cannot open with App links, I found this note in the documentation of the Android developer:
On apps that target Android 12, the system makes several changes to how Android App Links are verified. These changes improve the reliability of the app-linking experience and provide more control to app developers and end users. You can manually invoke domain verification to test the reliability of your declarations.
That is a big change on Android 12 and higher! I missed!!!
II. Find solutions
- Manual:
At that time, the good news is with Android 12 and higher, users can change the settings: App info -> Open by default -> Add link.
From here, users can select the domains that they want to associate with your app, as shown in Figure 2. Later select any link within the domains they add, and the link automatically opens in your app. That is a rapid solution for the dev to have a self-test.
🙂 Is there another way that I can make app links verified automatically?
2. Make the assetlinks.json
to verify the App links
Let’s compare my app with Twitter as well! Until the switch button is hidden at the tail of the domain name, your app is guaranteed verified!
With the solution below you need help from your infrastructure team, there are 3 steps:
👉 Step 1: Configure on <intent-filter>
on Android 12 and higher, to detect http/https scheme you can’t use Web links, instead, you should use App links that include android:autoVerify=”true”
and this will notify the system to check whether the domain is verified or not.
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Ex URIs "http://app-link.com/demo?id=255” -->
<data
android:host="app-link.com"
android:scheme="http" />
</intent-filter>
👉 Step 2: Generate a assetlinks.json
digital asset file to create a link between the host and the application, what should I prepare?
Option 1 — Create the assetlinks.json
file manually
- Create an empty file named
assetlinks.json
- Place the following information inside this file template.
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "<Your App’s package name>",
"sha256_cert_fingerprints":
["<Your App’s SHA256 finger print>"]
}
}]
Just replace 🧑💻
package_name
sha256_cert_fingerprint
If you have several applications or flavors utilizing the same domain, include them in the file.
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.app.demo.dev",
"sha256_cert_fingerprints":
["<Your App’s SHA256 finger print>"]
}
},
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.app.demo.qa",
"sha256_cert_fingerprints":
["<Your App’s SHA256 finger print>"]
}
},
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.app.applink",
"sha256_cert_fingerprints":
["<Your App’s SHA256 finger print>"]
}
]
Generate the sha256_cert_fingerprints
by using the command (ensure to create and configure a Keystore for your app first)
keytool -list -v -keystore app-link-release-key.keystore
Option 2 — Use Android Studio’s App Link Assistant
On the menu of Android Studio: Tools -> App Links Assistant -> Open Digital Assets Links File Generator, and fill below information -> Click Generate Digital Assets Link File.
Option 3 — Use Google’s statement list generator tool
👉 Step 3: Publish the assetlinks.json
file (for the infrastructure team) at the location:
https://domain.name/.well-known/assetlinks.json
Don’t forget to extend a special thank you to your infrastructure team! :)
3. How to make sure that it works?
- Verify on the link:
https://domain.name/.well-known/assetlinks.json
and make sure yourapplicationID
is already on it. - Use the Google tools generator: to check, fill in the information, and click Test statement
- Check on your App: After having confirmed that the hosted JSON file is valid, install the app on your device with the build type
Release
(important). Wait at least 20 seconds for the asynchronous verification process to complete. Use the command below to check whether the system verified your app, if true, your app will be opened.
adb shell am start -a android.intent.action.VIEW \
-c android.intent.category.BROWSABLE \
-d "http://domain.name:optional_port"
- Check the status on App Info: As I have mentioned above, go to App Info, and have no switch button appear following the domain name.
Alright, checks completed! You can now confidently send your app to the testers for another round of verification.
III. Conclusion
Here are the key takeaways from this post:
- Ensure that
android:autoVerify=”true”
in the Android Manifest within intent filters, that respond to intents with http/https scheme on Android 12 and higher. - Generate an
assetlinks.json
digital asset file to create a link between the host and the application. - Deploy the
assetlinks.json
at location: https://domain.name/.well-known/assetlinks.json - Review the verification results and continue test flow app links on your app.
References
#Android #AppLinks