javascript - Android - 深度链接并非在所有情况下都适用于所有浏览器

标签 javascript android android-intent deep-linking

我为我的一个 Activity 创建了一个 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 消息或推文中单击这些链接时,在应用程序选择器对话框中选择任何浏览器时,它会识别我的 Intent 过滤器并打开正确的 Activity 。这意味着我的 Intent 过滤器定义正确。

但是...在某些情况下,我需要从设备的日历或 HTMLViewer 中单击这些链接。在这些情况下,当我选择标准浏览器时,我的应用程序未打开。它只是用 URL 地址打开浏览器。当我选择设备的库存浏览器时,就会发生这种情况。当我选择不同的浏览器(例如 Chrome)时,应用程序会正确打开。 知道为什么吗?或者我怎样才能使深度链接在所有情况下都能正常工作?

2 重要注意事项:

  1. 我目前正在 Galaxy S3 上对此进行测试。我知道 Galaxy 设备上的浏览器本身不被视为“库存”。我仍然希望找到一个适用于所有设备的解决方案。

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

无论如何,我非常感谢来自 SO 社区的任何帮助。这对我来说一直很痛苦(我敢肯定对其他人来说也是如此)。

谢谢。

最佳答案

我看不出您发布的内容有任何明显错误,但您说:

In these cases my app is not opened when i select the stock browser.

当您点击链接时,您的应用程序是否未显示为可供选择的选项?如果您的过滤器匹配,它应该是一个选项,不是吗?如果您选择默认浏览器,我不会责怪它吞下了 Intent 。

无论如何,如果您无法使其正常工作,您可以使用一些客户端 Web 代码将 url 发送到应用程序(如果已安装),如果未安装则关闭到商店,并将 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 设置有一点错误。您当前的过滤器适用于这样的 URL https://myserver.com/product/blah但不是https://myserver.com/product

这是您的更新 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>

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

希望这能解决您的问题。

关于javascript - Android - 深度链接并非在所有情况下都适用于所有浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24315820/

相关文章:

javascript - 为什么 javascript 方法在与 setTimeout 一起使用时会失去与对象的连接

Android 忽略 styles.xml 中的 layout_weight 参数

android - 如何在 Android 的 Web Intent 中启动本地 HTML 页面?

Android:尽管设置了 MIME 类型,但 PDF 文件仍隐藏

javascript - 访问不常见 JSON 对象中的数据

javascript - 没有 FormPanel 的 Google Apps 脚本 FileUpload()?

java - 虽然 Android 中真正的 bucles

java - ZXing条码扫描仪仅扫描应用程序条码

javascript - 格式化超过 24 小时的 MomentJS 持续时间

java - AS 2.3.3、Gradle 3.3、Java 1.8 无法解析 java.time.format.DateTimeFormatter 的导入;