The Challenge: A Fragmented User Journey
When users click a promotional link, the expected behavior varies drastically based on their device OS and whether the app is already installed.
- iOS users should be routed to the App Store if uninstalled.
- Android users must hit Google Play if uninstalled.
- If the app is already installed, the user expects to land deep inside the app on the specific product screen, completely bypassing the browser.
However, in a Flutter cross-platform environment, getting iOS Universal Links (Associated Domains), Android App Links, and deferred deep linking (for post-install routing) to work harmoniously is notoriously difficult. OneLink solves this, but its implementation requires rigorous OS-level configuration.

SDK Initialization Protocol
The order of execution during app startup is critical. AppsFlyer must be initialized after Firebase (if used for push/analytics) but strictly before the first Flutter screen renders to ensure the routing payload is caught and acted upon.
iOS Configuration: Associated Domains
iOS relies on the Apple App Site Association (AASA) file hosted securely domains.
1. Entitlements configuration (Runner.entitlements):
2. AASA Host File (/.well-known/apple-app-site-association):
Must be uncompressed JSON served over strictly HTTPS without redirects.
Android Configuration: Verified App Links
Android 12+ requires App Links to be strictly verified using Digital Asset Links.
1. AndroidManifest.xml intent filter:
2. assetlinks.json Hosting:
Rigorous QA Methodology
Deep links fail silently. To prevent broken user experiences, we executed a 15-point test matrix:
| Test scenario | Expected result |
|---|---|
| iOS: OneLink tap, app not install | App Store opens gracefully |
| iOS: OneLink tap, app installed | Target app screen opens instantly via Universal Link |
| iOS: Install via tap (Deferred) | First open triggers onInstallConversionData routing |
| Android: Tap, installed | App Links intercept without browser disambiguation dialog |
| Meta in-app browser | Falls back properly without getting trapped in WebView |
| ATT prompt iOS 14.5+ | Initialization respects timeToWaitForATTUserAuthorization |
Business Outcomes
After successfully deploying and verifying OneLink across both platforms, campaign conversion rates from Influencer and CRM push channels skyrocketed by 34%. Users were no longer dropping off at the App Store front page; they were transported directly to the cart with their promo codes pre-applied.
Further Reading & Deeper Dive
Understanding how deep links interact with the OS layer is vital for modern mobile engineers.
- Apple Developer: Supporting Associated Domains
- Android Developers: Handling Android App Links
- The Trap: Relying solely on a tool like AppsFlyer doesn't absolve the developer from natively configuring
.well-knowndomains. If the OS rejects the signature, the deep link fails silently—costing serious marketing dollars.