- HTTP/HTTPS Deep Links: URLs with
http://orhttps://protocols that can open your app when clicked. Requires domain verification. - Custom URI Schemes: URLs with a custom protocol like
myapp://that are registered to your app. No verification needed.
HTTP/HTTPS Deep Linking
HTTP/HTTPS deep links (including App Links on Android and Universal Links on iOS) require you to prove domain ownership before they work reliably. The setup has four parts:- Create your verification config files
- Save them in Linkrunner
- Update native configuration (Android & iOS)
- Configure your app’s navigation
Step 1: Create Verification Config Files
- Android
- iOS
Create the Digital Asset Links file
Create a file namedassetlinks.json with the following content:your.package.namewith your actual Android package nameSHA-256:XX:XX:XX:...with your app’s SHA-256 fingerprint
Get your app’s SHA-256 fingerprint
For debug builds:Step 2: Save Verification Config in Linkrunner
Linkrunner hosts your verification files automatically so you don’t have to manage server configuration yourself.- Log in to your Linkrunner dashboard
- Go to Project Settings from the navigation menu
- In the Domain Verification section:
- Paste your
apple-app-site-associationJSON in the iOS (Only JSON allowed) text area - Paste your
assetlinks.jsoncontent in the Android (Only JSON allowed) text area
- Paste your
- Click Save
- iOS:
https://your-domain.io/.well-known/apple-app-site-association - Android:
https://your-domain.io/.well-known/assetlinks.json
Step 3: Update Native Configuration
These changes are the same whether you’re using React Native or Flutter.- Android
- iOS
Open Then reference it from Replace
android/app/src/main/AndroidManifest.xml and add the following inside the <activity> section:Enable install detection (Continue to app popup)
To let the Linkrunner redirect page detect that your app is installed and show a Continue to app popup instead of sending the user to the store, declare anasset_statements link back to your subdomain.Add the statement to android/app/src/main/res/values/strings.xml:AndroidManifest.xml, inside the <application> section:https://your.subdomain.com with your Linkrunner subdomain. This is the app→site half of the Digital Asset Link. Linkrunner already hosts the site→app half at /.well-known/assetlinks.json on your subdomain.Step 4: Configure Navigation
- React Native
- Flutter
React Native uses React Navigation for handling deep links.
Custom URI Schemes
Custom URI schemes use a custom protocol likemyapp:// and don’t require domain verification. They’re useful for backward compatibility or simpler setups.
Native Configuration
- Android
- iOS
Open
android/app/src/main/AndroidManifest.xml and add inside the <activity> section:Testing Your Deep Links
- Android
- iOS
- Web
Use If the HTTPS link opens the browser instead of your app, see Debugging Domain Verification.
adb to test:Debugging Domain Verification
If an HTTPS link opens the browser instead of your app, domain verification is the usual cause. Work through these checks to find where it’s failing.- Android
- iOS
Check the hosted file
Confirm the file Linkrunner hosts for you is live and correct:If it returns a 404, your config isn’t saved. Re-save it in Project Settings → Domain Verification. If it loads, check that
package_name matches your app and sha256_cert_fingerprints includes the fingerprint of the keystore that signed the build you’re testing.You can also have Google’s Digital Asset Links API validate it, which surfaces formatting errors:Check the verification state
On Android 12+, print the verification state of every domain in your manifest:
| State | Meaning |
|---|---|
verified | Verification passed. Links for this domain open your app. |
none | Verification hasn’t run yet. It runs automatically about 20 seconds after install. |
1024 (or higher) / legacy_failure | Verification failed. Check the fingerprint and hosted file. |
approved | Manually approved, e.g. by the user in app settings. |
denied | Manually disallowed by the user in app settings. |
On Android 11 and below, run
adb shell dumpsys package domain-preferred-apps instead, and watch adb logcat | grep IntentFilter during install for verification messages.Clear the cached state and re-verify
Android caches verification results, so fixing Reinstalling the app also triggers a fresh verification pass.
assetlinks.json has no effect until verification runs again. Clear the cached state and re-run it:Force-approve the domain while debugging (optional)
To test your in-app navigation before verification passes, approve the domains manually. This is equivalent to the user enabling Open supported links in app settings:If links open your app after this but verification still fails, the problem is in the hosted file or fingerprint, not your app code.
Troubleshooting
Links open in the browser instead of the app (Android)
Links open in the browser instead of the app (Android)
- Check that the intent filter includes
android:autoVerify="true"and lists the exact host you’re testing. - Check the verification state and re-verify (see Debugging Domain Verification).
- The SHA-256 fingerprint in Linkrunner must match the keystore that signed the build on your device. Debug and release builds have different fingerprints.
Works with a debug build but not the release build (Android)
Works with a debug build but not the release build (Android)
Release builds are signed with a different keystore, so they have a different SHA-256 fingerprint. If you use Google Play App Signing, the production fingerprint comes from Play Console → Setup → App integrity, not your local keystore. Add the release fingerprint to
sha256_cert_fingerprints in Linkrunner alongside the debug one.Universal Links don't open the app (iOS)
Universal Links don't open the app (iOS)
- Check that
appIDisTEAM_ID.BUNDLE_IDwith the correct Team ID, and that the Associated Domains capability lists your domain. - Check what Apple’s CDN is serving (see Debugging Domain Verification). If it’s stale, use developer mode.
- Don’t type the URL into Safari. Universal links only trigger when tapped from another app.
I updated the verification files but nothing changed
I updated the verification files but nothing changed
Both platforms cache verification results:
- Android: clear the cached state with
adb shell pm set-app-links --package your.package.name 0 all, then re-verify withadb shell pm verify-app-links --re-verify your.package.name. - iOS: wait for Apple’s CDN to refresh (up to a day) or enable developer mode, then delete and reinstall the app.
Custom URI scheme doesn't open the app
Custom URI scheme doesn't open the app
Check that the scheme is registered (intent filter on Android, URL Types in Xcode on iOS) and that the app is installed on the device. Use lowercase schemes everywhere; Android matches them case-sensitively.