简体   繁体   中英

How to open an Android App link from a webview

I have an app that can handle app links.

For example, if you have a link such as https://my-app-domain.com/something and you click on it, it would launch my app.

However, if the link was sent in an app that opens links in a webview, my app won't be launched. For example, Facebook Messenger, Instagram and Snapchat all open links in their own webview which takes the user to my website instead of launching my app.

What I'm trying to do is make this link launch my app even it was sent in an app that opens links in a webview.

Thanks,

Like you say, Facebook messenger doesn't handle App links/universal links.

I've been experimenting a bit and it seems like custom uri scheme style links (my-app://something) work. What you can do is to implement a web fallback on https://my-app-domain.com/something which tries to redirect the browser to your custom uri, and if this doesn't work, display a nice web page. This is how big companies such as Spotify does it.

On Android you can support both app links and a custom uri scheme by specifying multiple intent-filters;

    <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="my-app-domain"
            android:pathPrefix="/something" />
    </intent-filter>
    <!-- Google claims that one intent-filter can handle multiple <data> elements, this seems to be untrue however -->
    <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="my-app" />
    </intent-filter>

Then on your web fallback at https://my-app-domain.com/something , you would have this disgusting hack.

<script>
    window.location = 'my-app://something'
    // optional secondary fallback
    setTimeout(() => {window.location = 'https://secondary-fallback'}, 1000)
</script>

The result is that if you have the app installed you end up in your app as expected, but if you don't, you end up at your secondary fallback page.

The same principle works for iOS too. I'm using react native and there I've added the following in my AppDelegate.m:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
 sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
  return [RCTLinkingManager application:application openURL:url
                  sourceApplication:sourceApplication annotation:annotation];
}

And then specify a uri scheme in Info.plist:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>my-app</string>
        </array>
    </dict>
</array>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM