如何从Web视图打开Android App链接

问题描述 投票:1回答:1

我有一个可以处理应用程序链接的应用程序。

例如,如果您有一个链接,例如https://my-app-domain.com/something,然后单击它,它将启动我的应用程序。

但是,如果链接是在打开Web视图中链接的应用程序中发送的,则我的应用程序将无法启动。例如,Facebook Messenger,Instagram和Snapchat都在自己的Web视图中打开链接,这些链接将用户带到我的网站,而不是启动我的应用程序。

[我要做的是,即使此链接是在打开了Web视图中链接的应用程序中发送的,也要使该链接启动我的应用程序。

谢谢,

android webview deep-linking applinks
1个回答
0
投票

就像您说的那样,Facebook Messenger无法处理应用程序链接/通用链接。

我一直在尝试,似乎自定义uri方案样式链接(my-app:// something)起作用。您可以做的是在https://my-app-domain.com/something上实现Web后备,它会尝试将浏览器重定向到您的自定义uri,如果这不起作用,则显示Web后备。像Spotify这样的大公司就是这样做的。

在Android上,您可以通过指定多个intent-filters来支持应用程序链接和自定义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" android:host="something" />
    </intent-filter>

然后在您的网络备用站点https://my-app-domain.com/something上,您将得到此令人恶心的骇客。

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

结果是,如果您安装了该应用程序,则最终将按预期方式进入您的应用程序,但如果没有安装,则最终会出现在辅助后备页面上。

同样的原理也适用于iOS。我正在使用本机反应,并在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];
}

然后在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>
© www.soinside.com 2019 - 2024. All rights reserved.