In 2015, Apple introduced Universal Links on iOS 9 as its solution to deep linking and convoluted URI schemes. Universal Links serve as standard web links (i.e., www.branch.io), but point to a website page and content in the app. This standard was invented to provide developers with a graceful fallback if the app was not installed on a user's phone, and to remove URI schemes from the mobile ecosystem.
How Do Universal Links Work in iOS?
Before Universal Links, the primary mechanism to open up an app when it was installed was redirecting to an app’s URI scheme in Safari. This put the routing logic in Safari, but there was no way to check if the app was installed or not. This meant that developers would try to call the URI scheme 100% of the time, in the off chance that the app was installed, then fallback gracefully to the App Store when not using a timer.
Universal Links were intended to fix this. Instead of opening up Safari first when a link is clicked, iOS will check if a Universal Link has been registered for the domain associated with the link, then check if the corresponding app is installed. If the app is currently installed, it will be opened. If it’s not, Safari will open and the http(s):// link will load.
Functionally, Universal Links allows you have a single link that will either open your app or open your mobile site. Here is a Guide to Implementing Universal Links.
Limitations of Apple Universal Links
- They are not Universal. At all.
Apple implemented Universal Links in a way that would force the major app platforms (Facebook, Twitter, Pinterest, etc) to make substantial and harmful changes to the way they handle external links. Currently, the way that most of these feed-style apps handle external links is to intercept the click and open with an internal webview. This allows them to do a ton of tracking of how the user navigates the web, but only within the confines of the app. Triggering a Universal Link requires them to send a clicking user externally and loses their ability to track, which is core to their business.
Because of this, if you plan on using your links on these platforms, you must build special edge case handling to support deep linking with legacy methods. Facebook has their own App Links standard which promises similar functionality to Universal Links, but their flagship iOS app doesn’t even support their own standard. As of March 2016, it’s basically impossible to open up your app out of Facebook in a reliable way.
There are few apps that support Universal Links today and most are Apple-built apps, like Mail, Notes, and Messages.
- Universal Links don’t work for email campaigns.
Email is a primary communication channel for companies interacting with their users, and is becoming increasingly relevant in mobile marketing. Because of the volume and complexity of email campaigns, most brands end up using an external provider like Sailthru, Mailchimp, or Sendgrid.
These providers provide an array of services, one of which is open, click, and conversion tracking. In order for them to do click tracking, they must wrap the original link in a redirect so that the user hits the provider’s server prior to being sent to the destination.
Sound familiar? It’s basically the description of every transactional and marketing email that you receive every day. The bad news: it’s impossible to use Universal Links in this scenario. You can’t wrap a Universal Link in a redirect and have it still work. So, either you universify the redirecting domain or you give up click tracking entirely. Every marketer we’ve talked to has said that this is a deal breaker for them.
We’ve had to do a ton of work to support this use case for our mobile marketers so that finally Branch works with all major providers to provide click/install tracking for Universal Links in email. No company would do this on their own, and they shouldn’t have to.
- They are easily broken by users and hard to re-enable.
It’s currently incredibly easy for a user (or an app developer for that matter) to permanently disable Universal Links on the phone. A user simply needs to click the domain name in the top right hand corner of the screen after clicking a Universal Link. You’ll notice in iOS 9 that there’s both a back button and a link to the domain if you originated from a Universal Link. Here’s an example from LinkedIn:
If I were to click ‘linkedin.com,’ it would open up Safari and permanently disable Universal Links for my device. There are few ways to re-enable them, but for all intents and purposes, a user would never figure it out.
- Universal Links are nearly impossible to debug and test.
For developers, the ability to verify the functionality of a feature is critical to development. Debugging Universal Links is easily a 6-7 step process spanning a web server config, developer portal configuration, and native app project configuration. And it’s incredibly easy to make a mistake along the way. Forget an end bracket in the structured JSON file you have to host on your own server? Broken Universal Links. Didn’t include the entitlements file in your app build? Broken Universal Links. It’s treacherous.
Despite the hundred ways that Universal Links can break, Apple didn’t provide a single validator tool to help a developer debug. We had to build our own Universal Links validator, saving developers from walking through each step, checking every line of code to ensure they didn’t miss a critical step. What should take five minutes can take a day or two to debug.
Universal Links Validator