Universal Links for Android and iOS
Article Summary
Konstantin Yakushev from Bumble reveals the brutal truth about universal links: Apple and Google's 'simple' solution is riddled with undocumented bugs that break user experience. Here's how Badoo's team catalogued every dragon and built a system that actually works.
When Badoo (now Bumble) set out to implement universal links for seamless app-to-web sharing, they discovered that redirects fail, SafariViewController breaks everything, and one mysterious iOS button permanently disables deep linking. This deep dive chronicles their journey from failed third-party solutions to a custom implementation handling millions of links.
Key Takeaways
- Universal link redirects silently fail on iOS (undocumented Apple limitation)
- SafariViewController blocks all universal links, requiring dual-domain hack to bypass
- iOS 9-10 'back to Safari' button permanently breaks deep links per device
- Solution: Two registered domains that cross-link, custom minifier, HTML preview fallback
- Deferred deep linking uses fingerprinting (IP, device model) to match post-install users
Badoo built a production universal link system by working around five major undocumented platform bugs, using dual domains, custom URL shortening, and strategic HTML previews to ensure links work across iOS, Android, and web.
About This Article
Konstantin Yakushev's team at Badoo found a problem with AppsFlyer's universal link setup. The links were being redirected through onelink.me, a third-party domain, which meant Safari would open instead of the app even though the SDK was integrated correctly.
Badoo decided to build their own universal link system instead. They used two registered domains, m.badoo.com and mlink.badoo.com, that pointed to each other. This approach gave them full control over how links behaved and removed the need for external redirect services.
The custom system worked well for Badoo. Millions of users could now share content on Facebook, Telegram, and email and have universal links work properly. They no longer depended on branch.io or AppsFlyer's infrastructure.