Every day, an increasing number of users are entering our apps more contextually then simply coming through the front door. This means that we have to be prepared to greet these users in different ways, providing them with a user experience that’s fitting for their user journey.
With iOS 9 we now receive users through deep links in two different ways - applicationDidFinishLaunching: URLs and handleUserActivity: activities. Apple have indicated that NSUserActivity is the future and so I would definitely recommend basing any routing functionality on NSUserActivity. (DeepLinkKit soon will be too).
Deep links raise the bar on the user experiences we can offer, but also come with some challenges. This is a collection of best practices that we follow ourselves and share with our partners.
Assume that the home screen is just one entry point
Your app is a document structure and the home screen is simply the route “/“. Ensuring that you don’t think about your app as a predefined linear flow is key to the philosophy of making your app accessible & intuitive for incoming users. Deep links are analogous to “landing pages” in the web and our funnels will begin to look a lot more like a connected graph than a linear flow.
Push registration as late in the flow as possible
Users from deep links are expressing intent to do or see something; get them as close as possible to that action without slowing them down with a registration / login wall.
From our observations, pushing registration to checkout vs. at app open increases conversion by more than 50%.
Skip ‘on boarding’ tutorials for deep links
A deep link means that the user already has a certain amount of context around what they’re trying to do. Like registration, avoid lengthy first-time tutorials that stand between the users and what they’re trying to get to. Interestingly, this could be a good argument for the return of coach marks where absolutely necessary - it makes it simple to walk the user through any UI complexity directly on the content that they’ve linked to.
Show a loading screen while you load any necessary content
There’s nothing worse than deep linking and landing on the home screen (“/“ 😉). Is it working? Is it not? Thinking about the app as a document structure, you wouldn’t load a website home page to then load a detail page - it’s confusing in apps too. Where possible, a global loading view allows you to immediately show a UI while you fetch any data required and then present the user with their linked content as the first view.
404 - App Content not found
This is an interesting topic - what do you do if a user attempts to link to a deep link / user activity which doesn’t work, either because the route is invalid or the content doesn’t exist? The current ‘defacto’ behavior is to do nothing and ignore the link but this seems unintuitive to users. The user has expressly requested that your app show them something in particular and unfortunately we can’t comply - we should tell them.
The way that I prefer to do this is to use non-modal notification methods to let the user know, while not getting in the way in case the deep link is not critical. A dedicated ‘404’ style page seems like overkill.
e.g. “Couldn’t load product 1234” or “Unfortunately that path doesn’t exist” as a notification in-app.
Track incoming deep links — this is your ‘landing page’
The goal of tracking is to understand how users are using your app — where they land and how they got there are two key parts of that. It’s helpful to report all incoming deep links to your event tracking system, avoid tracking the “/“ home page view if it’s just loading a deep page and if possible, capture the sourceApplication to know where users are coming from.
Test your deep link routing
An increasing portion of your user sessions will begin with a deep link and they will fast become the most engaged and lucrative - a user from a deep link has context and intent. Don’t lose this intent by not properly testing your deep link route handling. A casual test of a few dozen apps in the App Store found that almost 1 in 5 app’s deep links either didn’t do anything or crashed.
Automation testing is a great way to do this - here is an example of how we like to test this in DeepLink Kit. Using deep links as the way that you handle your own internal navigation is another good way to make sure that it gets the testing that it deserves.
Add to this list!
These are some of the best-practices that we’ve collected, let us know what else you think should be front-of-mind when handling deep links on Twitter (@button) and we’ll add them to this list!