我为我的一个 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 重要注意事项:
我目前正在 Galaxy S3 上对此进行测试。我知道 Galaxy 设备上的浏览器本身不被视为“库存”。我仍然希望找到一个适用于所有设备的解决方案。
深层链接的 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/