← Blog Developers · 2 min read

Mobile deep links: opening the app instead of the browser

Universal Links, App Links, custom schemes and the fallback chain that stops users landing on a blank page.

By ShortFreeURL Team · 7 June 2026

Three mechanisms, one goal

iOS Universal Links and Android App Links both associate an HTTPS domain with an installed app so a normal link opens the app directly. Custom URL schemes (myapp://) are older, still useful as a fallback, but show an ugly error if the app is missing.

The association files

iOS reads /.well-known/apple-app-site-association — a JSON file, served over HTTPS, with no file extension and no redirects, containing your Team ID and bundle ID. Android reads /.well-known/assetlinks.json containing your package name and the SHA-256 fingerprints of your signing certificates. A link platform that owns your short domain must serve both for you.

Signing fingerprints are the usual bug

Debug builds, release builds and Play App Signing all produce different fingerprints. List every one you actually ship. A single missing fingerprint means the link silently opens the browser instead of the app, with no error to debug.

The fallback chain

App installed and association valid → app opens. App missing → the browser opens your web page, or the store listing if that is more useful. Android intent URLs let you specify the fallback URL inline, which is the most reliable pattern.

Deferred deep linking

If someone taps a product link without the app, ideally they install it and land on that product, not the home screen. This needs the destination to be stashed and matched after install, which is app-side work — the link platform can only carry the parameters.

Test on real devices

Simulators lie about association files. Test a fresh install, an existing install, and the no-app case on both platforms before a campaign goes out.

Related posts

Start Free — no credit card

The free plan includes 1,000 links, 6 custom domains and 50,000 tracked clicks a month, free forever. Choose a free subdomain from six shared domains. Paid plans start at $4 a month when you outgrow it, and you keep everything you have built.