简体   繁体   English

如何从 webview 打开 Android 应用程序链接

[英]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.例如,如果您有一个链接(例如https://my-app-domain.com/something)并单击它,它将启动我的应用程序。

However, if the link was sent in an app that opens links in a webview, my app won't be launched.但是,如果链接是在一个在 web 视图中打开链接的应用程序中发送的,我的应用程序将不会启动。 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.例如,Facebook Messenger、Instagram 和 Snapchat 都在他们自己的网页视图中打开链接,将用户带到我的网站而不是启动我的应用程序。

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.我想要做的是让这个链接启动我的应用程序,即使它是在一个在 web 视图中打开链接的应用程序中发送的。

Thanks,谢谢,

Like you say, Facebook messenger doesn't handle App links/universal links.就像你说的,Facebook Messenger 不处理应用程序链接/通用链接。

I've been experimenting a bit and it seems like custom uri scheme style links (my-app://something) work.我一直在尝试,似乎自定义 uri 方案样式链接(my-app://something)工作。 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.您可以做的是在https://my-app-domain.com/something上实现 Web 回退,它会尝试将浏览器重定向到您的自定义 uri,如果这不起作用,则显示一个不错的网页。 This is how big companies such as Spotify does it.这就是 Spotify 等大公司的做法。

On Android you can support both app links and a custom uri scheme by specifying multiple intent-filters;在 Android 上,您可以通过指定多个意图过滤器来支持应用程序链接和自定义 uri 方案;

    <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.然后在https://my-app-domain.com/something上的 Web 回退中,您会遇到这种令人作呕的黑客攻击。

<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.同样的原理也适用于 iOS。 I'm using react native and there I've added the following in my AppDelegate.m:我正在使用 react native,并且在 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:然后在 Info.plist 中指定一个 uri 方案:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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