我用TWA构建了一个PWA,并按照这里的官方Google指南生成了APK - https://developers.google.com/web/updates/2019/02/using-twa
正在发生的事情是,当除Chrome之外的其他浏览器设置为默认浏览器时,行为是不可预测的。例如:在小米手机上,MI浏览器是默认的,我的应用程序只是作为快捷方式工作,页面只是加载到浏览器的一个选项卡中。这款手机安装了 Chrome,但我的应用仍然使用默认浏览器来呈现我的 PWA。
官方文件如下:
现在,如果用户的 Chrome 版本不支持受信任的网络活动,Chrome 将使用自定义标签页回退到简单的工具栏。其他浏览器也可以实现受信任的 Web 活动使用的相同协议。虽然主机应用对打开哪个浏览器拥有最终决定权,但我们建议采用与自定义选项卡相同的策略:使用用户的默认浏览器,只要该浏览器提供所需的功能即可。
虽然指南有这一段,但我找不到任何有关如何为我的PWA设置首选浏览器的文档
不建议强制 Chrome 作为浏览器来处理受信任的 Web 活动,因为支持受信任 Web 活动的浏览器数量正在增加,开发人员应尽可能尊重用户的浏览器选择。
在 android-browser-helper 中选择浏览器的实现将:
- 寻找支持 TWA 的浏览器,如果找到,请选择它。
- 否则,请查找支持自定义选项卡的浏览器,如果找到,请选择它。
- 否则启动到默认浏览器。
或者,开发人员可以选择将数字 2 和 3 替换为 WebView 回退实现,即使对支持的功能集进行了权衡。
关于以下内容:
在小米手机上,MI浏览器是默认的,我的应用程序就像快捷方式一样工作,页面只是加载到浏览器的一个选项卡中。这款手机安装了 Chrome,但我的应用仍然使用默认浏览器来呈现我的 PWA。
这里可能会发生一些事情:
- 安装的 Chrome 版本不是最新的,不支持受信任的网络活动,因此它会回退到 (2)
- MI 浏览器声明支持受信任的 Web 活动,但实际上并非如此。这似乎是Kindle Fire设备的情况。
- 选择浏览器的逻辑上可能存在错误。
对于 1,解决方案是更新 Chrome,一切正常。否则,请启用 Web 视图回退。
对于 2,听起来需要的是一个"禁止列表",以避免使用已知声明支持但没有的浏览器。我建议在 https://github.com/GoogleChrome/android-browser-helper/提交功能请求
对于 3,在 https://github.com/GoogleChrome/android-browser-helper/提交错误
更新:我安装了MI浏览器,其中包含通过Bubblewrap生成的项目。MI 浏览器不会声明支持受信任的网络活动,并且 Chrome 会按预期打开。我倾向于与上述(1)相关的问题。
最后,可以为受信任的 Web 活动实现您自己的提供程序选取器,您可以在其中维护"禁止列表",而 Android 浏览器帮助程序中未实现自动方式。有关详细信息,请参阅此示例。
要在 Chrome 中打开网址,我使用的是 Chrome 自定义标签页androidx.browser.browser:1.0.0
首先我检查是否支持 Chrome 自定义标签页
const val SERVICE_ACTION = "android.support.customtabs.action.CustomTabsService"
const val CHROME_PACKAGE = "com.android.chrome"
private fun Context.isChromeCustomTabsSupported(): Boolean {
val serviceIntent = Intent(SERVICE_ACTION)
serviceIntent.setPackage(CHROME_PACKAGE)
val resolveInfos = packageManager.queryIntentServices(serviceIntent, 0)
return !(resolveInfos == null || resolveInfos.isEmpty())
}
然后在自定义选项卡中打开 URL
if (isChromeCustomTabsSupported()) {
CustomTabsIntent.Builder().apply {
setToolbarColor(ContextCompat.getColor(this@MainActivity, R.color.colorPrimary))
setSecondaryToolbarColor(ContextCompat.getColor(this@MainActivity, R.color.colorPrimaryDark))
}.build().launchUrl(this@MainActivity, Uri.parse(URL))
}
如果Kotlin
中的答案不好,我会用 Java 重写
更新:我的答案仅在本机Android开发中为您提供帮助,当您想在Android上使用Chrome启动URL时。