Universal Links

Typically you’ll want to open Rover experiences through deep links and universal links (sometimes referred to as App Links). This is useful for integrating with a push notification automation solution or a CMS, and in the case of universal links, external communications such as email.

Universal links are for URIs that are valid web URLs that your app can also handle in addition to being viewable in a vanilla web browser. Rover makes your experiences available at Rover-hosted universal link locations, which are in the form of:

https://example.rover.io/…

Android apps can register themselves to handle URIs launched on the device that match a given pattern. This is analagous to an iOS feature called Universal Links that allows seamless linking of content that can be accessed through both a browser and within your app. Rover supports Universal Links for Experiences.

An example of a universal Experience URL might look like:

https://example.rover.io/my-great-experience

When a user opens this URL on a mobile device it will present the Experience directly in your app. If the user doesn’t have your app installed it will fall-back to viewing the web-based version of the Experience in the browser.

Universal links are HTTP(s) links that are hosted by Rover, offering similar functionality as deep links (but only displaying Rover Experiences), but unlike deep links they can fall back to a web-powered version of your Experience when viewed on a device without your app installed.


Similar to the URL scheme used by the Deep Links, each Rover account has a unique domain that is used to construct Rover universal links. You can find the domain assigned to your Rover account in the Rover Settings app next to the URL scheme.

Settings App

As is standard on Android, you will need an Activity to handle the incoming links. The following serves as a simple boilerplate example of how to handle the links.

Intent Filter

Add the intent filter for universal links to your Activity manifest entry, given that your app universal link domain name is, for example, example.rover.io:

<activity android:name="…"><!-- for http universal links/app links -->
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="http" android:host="example.rover.io" />
    </intent-filter>
</activity>

And then, for https:

<activity android:name="…"><!-- for https universal links/app links -->
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="https" android:host="example.rover.io" />
    </intent-filter>
</activity>

The activity receiving the intent requires some logic in order to start the RoverActivity, if you have your own routing infrastructure you may certainly make use of it.

override fun onCreate(savedInstanceState: Bundle?) {
/* ... other onCreate() logic ... */

val uri : Uri = intent.data ?: return

// Universal links are handled similarly:
if(uri.scheme ?: "" in listOf("http", "https") && uri.host == getString(R.string.associated_domain)) {
    startActivity(RoverActivity.makeIntent(packageContext = this, experienceUrl = uri, campaignId = queryCampaignId))
}