CORE JSC

International Technology Partnership

React Native

Fixing React Native Deep Linking Failures on Android 12+ (App Links and autoVerify)

Deep links work perfectly in development, but after release on Android 12+ they open a disambiguation dialog or the browser instead of the app. It's almost never a React Native bug — here's the real App Links verification cause and the definitive fix.

Core JSC Team·July 24, 2026
React NativeAndroidDeep LinkingApp LinksMobile Development

The Problem

A React Native app's deep links work perfectly in development (tapping a link opens the app directly), but after release — or specifically on Android 12 and above — the same link opens a disambiguation dialog asking the user to choose between the app and the browser, or opens the browser directly instead of the app. Nothing in the app's own linking code changed; the failure is almost always in how the App Links verification is set up, not in React Native's Linking API itself.

Why It Happens

Android 12+ tightened App Links verification

Starting with Android 12, the OS performs stricter server-side verification before it treats a link as a "Verified" App Link that opens the app with no dialog. If verification fails silently, the OS falls back to treating the link as an ordinary URL with ambiguous handling, which is exactly the ambiguity dialog or browser-opens-instead symptom.

The assetlinks.json file doesn't match the release signing certificate

Verification checks that the app's SHA-256 signing certificate fingerprint matches an entry in /.well-known/assetlinks.json on the target domain. A very common cause: the file was generated from the debug keystore's fingerprint, or from an old release key, and never updated after switching to Play App Signing (which re-signs the app with Google's own key at distribution time).

Missing autoVerify or a mismatched intent filter

The <intent-filter> in AndroidManifest.xml needs android:autoVerify="true" and must exactly match the scheme, host, and path patterns the app actually expects — a missing autoVerify attribute, or a filter that's too narrow (or too broad, matching a path the domain doesn't actually route to a real page), silently fails Android's automated verification.

The Fix

1. Get the correct signing certificate fingerprint — the one Google Play actually uses

keytool -list -v -keystore release.keystore

If the app uses Play App Signing, get the fingerprint from Play Console → App integrity → App signing, not from your local keystore — Google re-signs the app with a different key than the one you upload, and that's the fingerprint verification actually checks against.

2. Publish a correct assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.app",
    "sha256_cert_fingerprints": ["AA:BB:CC:...:ZZ"]
  }
}]

Host this at https://yourdomain.com/.well-known/assetlinks.json, served with Content-Type: application/json and no redirects — verification fails silently if the file 301s to another URL or is served with the wrong content type.

3. Set autoVerify and match the intent filter precisely

<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" />
  <data android:scheme="https" android:host="yourdomain.com" android:pathPrefix="/app" />
</intent-filter>

Every host/pathPrefix combination declared here must correspond to a real, working page on the domain — Android's verifier checks reachability, and a path that 404s can fail verification for the whole domain.

4. Verify with the actual tool Android uses, not just a manual click test

adb shell pm get-app-links com.example.app

This reports whether the domain is actually verified per-package on the device, which is far more reliable than tapping a link once and guessing from the observed behavior.

Why This Works

None of this changes how Linking or navigation is handled inside the React Native app — it fixes the OS-level trust check that happens before the app ever gets involved. Once the signing fingerprint, the hosted assetlinks.json, and the manifest's intent filter all agree with each other and with reality, Android marks the domain Verified and routes matching links straight to the app with no dialog.

Conclusion

Deep linking failures on Android 12+ are almost never a React Native bug — they're an App Links verification mismatch, usually the signing fingerprint (especially after Play App Signing re-signs the app) or a hosted assetlinks.json that's stale, misconfigured, or unreachable. Fix the fingerprint, the hosted file, and the intent filter together, and check the result with pm get-app-links instead of trial and error.