Why Has Google Broken Deeplinking on Android?


As close observers of mobile platforms have noticed, the latest Chrome build has seriously degraded the functionality of deeplinks on Android. The Intent URLs  can no longer be triggered from on-page JavaScript, causing all sorts of problems for app marketers.

The impact to Android users is significant:

  • Apps that utilize deeplinks will not launch
  • Apps that have rich in-app webview content (including Facebook) can no longer open Intent URLs
  • Facebook’s own App Links standard, designed to make deeplinking easier for developers, has been severely degraded and can no longer provide fallback URLs to those who don’t have the target app installed
  • Platforms like URX and DeepLink.me no longer work as designed, which may mean many wasted advertising dollars on Android
  • Many other mobile marketing platforms are presenting a broken user experience to their advertisers
  • Apps with rich and equivalent content in both their app and on their site can no longer use a non-Play Store destination as their fallback URL if the Android user doesn’t have the app already installed. That means if they’re not using a deferred deeplink product like Onboarding Links, the user’s intent will be lost

The technical details for this change are complex to describe, but it revolves around Chromium no longer able to launch certain intent URLs from JavaScript. This problem was confirmed by AppsFlyer in Issue 459156. The original submission from February 17 2015 reads:

What is the expected behavior?
Should redirect to Play Market or open page inside the app
Getting ERR_UNKNOWN_URL_SCHEME all the time, exept window.open call
What went wrong?
Did this work before? Yes In Chrome 38.x

A similar bug filed for webview was opened on February 24 2015.

What’s changed?

Deeplink companies commonly use JavaScript to attempt to redirect users to a deeplink. Recently, Google Chrome on Android was updated to version 40. The new version of Google Chrome does not support redirecting to non-HTTP/S URL schemes (including intent:// and custom app URL schemes like fb://) via JavaScript.

Redirects to these types of destinations still work if they’re performed by a redirect link instead of JavaScript, but that is not how they’re commonly used.

Why the change?

There are three possible reasons for this change in behaviour in Chrome:

  • A bug: Chrome is just swallowing unrecognized URL schemes instead of passing them to the Android intent handler like it should
  • Protection from naughty ads: JavaScript redirects to the app store are sometimes used in ad injections. This was a big problem on iOS for a time
  • Google’s preparing to produce their own way of doing this, perhaps something like the Smart App Banner on iOS. This would tie in nicely with their efforts to improve mobile SEO and their newly released Web App Install Banners.

If you’re affected by this bug we’d love to hear from you.

Note for Tapstream customers: we are not affected by this bug, as we don’t use JavaScript to launch URLs.

Update March 13: Some more information was gleaned thanks to a few tips and it seems that the new behaviour is not a bug. It was implemented to curtail some undesirable behaviour (option #2 in our three possible reasons above). Read more in our full update.

  • Stephan Lindauer

    thanks for your detailed information here and in that post on your blog, however i still have a question.
    you said “[…] from a link click that subsequently 302’s redirects or window.location redirects within 100 milliseconds of the gesture to an intent: URI then it should all still work.”
    but if this redirect happens from one domain to another, it will show the application chooser dialog, offering Chrome and the native app. I don’t quite understand why chrome is even in that list for a URL like “example://bla?Test” and further more I don’t get why this shows a different behaviour for “crossdomain” redirects. if this is due to security concerns i am overseeing, why is there no way of white listing domains from the Manifest.xml for example?

  • alicia beltran

    Hi, guys how are you. My problem is happening on android browser called “internet”
    Your post is clear but I cant solve the issue.
    If do you have any suggestion… please let me know.

    its my intent filter:

  • Riley

    The link to your “full update” no longer works: http://blog.tapstream.com/googles-changes-to-chrome-break-deeplinking-to