DriversRecommendedOutdated drivers can make a good PC feel brokenScan driver issues before chasing fixes manually.Scan NowOctober DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsPC HealthRecommendedCrashes, freezes, slowdowns? Check your PC nowSpot repairable issues before they interrupt work.Check PC×
Skip to content
Cupertino desk5 min

Flutter Deep Linking: Set Up Android App Links and iOS Universal Links

A practical guide to Flutter deep linking: associate your domain with Android and iOS apps, route incoming URLs, and verify the complete link flow.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

To make a website URL open the right screen in a Flutter app, configure two separate things: the app must route the incoming URI, and Android or iOS must verify that the website is associated with the app. Android uses App Links and a hosted assetlinks.json file; iOS uses Universal Links, an Associated Domains entitlement, and a hosted apple-app-site-association file. Configure both sides, then test a real tapped link on each platform.

How Flutter deep links work

Flutter documentation defines deep linking as launching an app with a URI. For web links, that URI is usually an HTTPS URL with a host and path. Android App Links and iOS Universal Links let an operating system open a verified website URL in its associated app; they are not the same as adding routing logic inside Flutter.

As an Amazon Associate I earn from qualifying purchases.

Think of the flow as two independent checks:

  1. Website association: the platform verifies that the domain is allowed to open the app.
  2. App routing: Flutter receives the URI and selects the corresponding screen or content.

If the first part is missing or invalid, the URL may remain in the browser. If the second part is missing or incorrect, the app may open but fail to show the intended destination.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Choose a Flutter routing approach

The Android manifest and Apple entitlement deliver a URI; they do not decide what your app should display. Your Flutter app needs routing behavior that maps the incoming path and any relevant URI data to a destination.

  • Simple navigation needs: Flutter’s navigation guidance says an app without complex deep-linking requirements can use Navigator.
  • Specific deep-link or advanced routing needs: use Flutter’s Router API or a routing package. Flutter’s setup examples use go_router, which Flutter describes as maintained by the Flutter team.

Plan the route mapping before configuring the domain. For each URL pattern you intend to support, decide which screen it should open and what the app should do if the path is unknown. The platform filters and association files should allow only the URLs your app is meant to handle.

Android App Links setup

1. Add an HTTP(S) intent filter

In android/app/src/main/AndroidManifest.xml, add a VIEW intent filter to the main activity. Flutter’s Android recipe uses the DEFAULT and BROWSABLE categories and sets android:autoVerify="true" for HTTP(S) URL rules. Configure the scheme and host to match the domain you intend to associate.

<!-- Add a VIEW intent filter to the main activity. -->
<!-- Include DEFAULT and BROWSABLE categories. -->
<!-- Set android:autoVerify="true" and match your HTTP(S) host. -->

This is a structural reminder, not a complete manifest: preserve the rest of your project’s activity configuration and make the host rules match the URLs you plan to handle.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

2. Publish the Android association file

Host a JSON file at https://yourdomain/.well-known/assetlinks.json. It must associate your Android package name with the SHA-256 fingerprint of the signing certificate used for the app. If you distribute builds signed with different keys, include the fingerprints that should be trusted.

Use the production package identity and signing certificate for the build you intend users to install. A mismatch between the manifest’s host, package name, or certificate fingerprint and the website file can prevent verification.

iOS Universal Links setup

1. Enable Associated Domains

In the iOS app target, enable the Associated Domains capability so the app receives the corresponding entitlement. Add an entry in the form applinks:yourdomain for each domain the app should handle. Use the domain without an HTTP or HTTPS prefix.

2. Publish the Apple association file

Host an extensionless JSON file named apple-app-site-association at https://yourdomain/.well-known/apple-app-site-association. The file identifies the app with the Apple Team ID followed by the bundle ID, and its components specify which URL paths are permitted to open the app.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Make the permitted paths agree with the routes Flutter actually handles. Apple’s CDN may take up to 24 hours to request the AASA file, so a newly published or changed association may not be reflected immediately.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Android App Links and iOS Universal Links compared

Configuration Android App Links iOS Universal Links
App-side setup VIEW intent filter in AndroidManifest.xml, with DEFAULT and BROWSABLE categories and android:autoVerify="true" Associated Domains capability/entitlement with applinks:yourdomain
Website file https://yourdomain/.well-known/assetlinks.json https://yourdomain/.well-known/apple-app-site-association
App identity Package name and SHA-256 signing-certificate fingerprint Apple Team ID followed by bundle ID
URL selection Intent-filter scheme and host rules AASA components and path rules
Important test caveat A direct adb launch can open the app without proving website association is configured Apple’s CDN may take up to 24 hours to request the AASA file

Check Flutter version and link-handler setup

Flutter’s deep-link cookbook guidance marks Flutter 3.27 as a setup boundary. For Flutter versions before 3.27, the cookbook instructions require manually enabling deep linking in platform configuration. Check the instructions that match your project’s Flutter release rather than assuming a current default applies to an older app.

Third-party link handlers, including app_links, can conflict with Flutter’s default handler. The cookbook explains disabling Flutter’s handler when using a third-party plugin. The precise configuration depends on the Flutter version, plugin release, and platform lifecycle; verify the package’s current documentation and changelog before adopting a version-specific setting.

Validate configuration and test real links

Flutter DevTools includes a deep-link validator for Android and iOS as of Flutter 3.27. Use it to help identify issues across the website and app configuration, but also test the complete experience from a tapped link on each platform.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  1. Check the hosted files: confirm each association file is available at the required HTTPS /.well-known/ path and contains the app identity and URL rules for that platform.
  2. Check app configuration: compare the Android intent-filter host and signing identity with assetlinks.json; compare the iOS entitlement and bundle identity with the AASA file.
  3. Check Flutter routing: open representative supported paths and confirm each lands on its intended screen. Also try an unsupported path and confirm the app handles it appropriately.
  4. Tap a real link: open a link from a browser or another app on Android, and test on an iOS device or Simulator. A direct Android adb launch demonstrates that the app can be opened with a URI; it does not prove the website association file is present or valid.

For an iOS Simulator test, Flutter’s recipe gives this command, replacing the domain and path with one you support:

xcrun simctl openurl booted https://yourdomain/path

For iOS association changes, allow for Apple’s CDN request delay before treating an immediate failure as proof that the file is malformed. DevTools validation, a URI launch, and a tapped verified web link answer different questions; use the user-facing tap to confirm the whole flow.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Outdated Drivers Are Slowing You DownFree scan - exact matches
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.