Android - 深层链接并不适用于所有情况和所有浏览器

时间:2014-06-19 20:37:06

标签: javascript android android-intent deep-linking

我为我的一个活动创建了一个intent过滤器,以便能够通过深层链接启动它:

     <activity
        android:name="com.myapp.activities.LoginActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data
                android:host="myserver.com"
                android:pathPrefix="/product/"
                android:scheme="https" />
            <data
                android:host="www.myserver.com"
                android:pathPrefix="/product/"
                android:scheme="https" />
        </intent-filter>
    </activity>

大多数情况下一切正常。当我从任何电子邮件客户端,whatsapp消息或推文中点击这些链接,在应用选择器对话框中选择任何浏览器时,它会识别我的意图过滤器并打开正确的活动。这意味着我的意图过滤器已定义好了。

但是......在某些情况下,我需要从设备的日历或HTMLViewer中单击这些链接。在这些情况下,当我选择股票浏览器时,我的应用程序未打开。它只是打开带有URL地址的浏览器。当我选择设备的股票浏览器时,就会发生这种情况。当我选择其他浏览器(例如Chrome)时,应用程序会正确打开。 知道为什么会这样吗?或者如何在所有情况下启用深层链接?

2个重要说明:

  1. 我现在正在Galaxy S3上测试这个。我知道Galaxy设备上的浏览器本身并不被认为是“库存”。我仍然希望找到适用于所有设备的解决方案。

  2. 深层链接的url地址是在浏览器端运行javascript的实际地址。对于未在用户设备上安装应用程序的情况,它会将其重定向到Play商店。我这样说是因为如果他们可以解决这个问题,我也会对服务器端解决方案开放。我看到了Question,但那里的答案对我不起作用。

  3. 无论如何,我非常感谢SO社区提供的任何帮助。这对我来说是一种痛苦(对其他人来说也是肯定的)。

    感谢。

1 个答案:

答案 0 :(得分:2)

我发现你发布的内容显然不对,但你说:

  

在这些情况下,当我选择股票浏览器时,我的应用程序没有打开。

您的应用是否在单击链接时不显示为可供选择的选项?如果您的过滤器匹配,它应该是一个选项吗?如果您选择默认浏览器,我不会因为吞噬意图而责备它。

无论如何,如果你无法使它工作,你可以使用一些客户端网络代码,如果安装了网址,则将网页发送到应用程序,如果没有,则将其发送到商店,并将URI方案修改为您自己的自定义方案。看到这个答案:

https://stackoverflow.com/a/8237102/1137254

然后你可以过滤两者:

<activity
    android:name="com.myapp.activities.LoginActivity"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:host="myserver.com"
            android:pathPrefix="/product/"
            android:scheme="https" />
        <data
            android:host="www.myserver.com"
            android:pathPrefix="/product/"
            android:scheme="https" />
        <data
            android:host="product"
            android:scheme="asafk" />
    </intent-filter>
</activity>

更新:我自己在Galaxy s3上进行了测试,发现你的pathPrefix设置有点错误。您当前的过滤器使用的网址类似于此https://myserver.com/product/blah,但不是https://myserver.com/product

所以这是你的更新意图过滤器(注意省略了正斜杠):

 <activity
    android:name="com.myapp.activities.LoginActivity"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:host="myserver.com"
            android:pathPrefix="/product"
            android:scheme="https" />
        <data
            android:host="www.myserver.com"
            android:pathPrefix="/product"
            android:scheme="https" />
    </intent-filter>
</activity>

如果这可以解决您的问题,请告诉我。您的用户可能仍然选择了错误的选项,因此我仍然建议您遵循我的其他建议,在尝试打开应用程序的页面上使用一些Javascript(它非常基本,但我认为它已被广泛使用)。

希望这可以解决您的问题。