0

上周我在 Turbolinks GitHub 页面上问了这个问题,因为我一直遇到这个桥注入失败问题。

这个问题非常断断续续,重现起来非常具有挑战性,但问题的代码是在某些设备上,我们看到Turbolinks Bridge Injection Failed错误并且我们的页面随后无法正确加载。

这里要发布的代码太多(更不用说 NDA 限制了),但足以说明该页面正在加载到大多数设备上,并且在失败的设备上,401由于身份验证详细信息错误,我们注意到服务器出现异常然后这个回调触发。

有谁知道为什么在某些设备上会出现桥注入问题,而在其他设备上却不会?

4

1 回答 1

0

事实证明,问题不在于我的代码或 turbolinks 的任何地方,而是与安装了 Chrome 浏览器的用户直接相关。

我跑了无数的数据日志和测试来确认,但结果是这样的:

如果设备出现以下情况,Turbolinks 将无法正常工作

1)没有安装 Chrome

2)已禁用 Chrome

3)有一个需要更新的过时版本的 Chrome(我找不到特定的最低版本,更多的是通用版本,需要在 X 版本之后进行更新)。

在这 3 种情况中的任何一种情况下,这Bridge Injection Error都会触发,这无疑是原因。

解决方案是通过他们的设备将用户重定向到 Play 商店,并指示他们下载、启用或更新 Chrome。

/**
 * Open the Google Play store app URL Link
 */
void openChromeAppPlayStoreLink() {
    //Try catch logic pulled from - https://stackoverflow.com/a/11753070/2480714
    String chromeStr = "com.android.chrome";
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("market://details?id=" + chromeStr));
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
    try {
        startActivity(intent);
    } catch (android.content.ActivityNotFoundException anfe) {
        //Will fail if play store is disabled or uninstalled for some reason
        intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("https://play.google.com/store/apps/details?id=" + chromeStr));
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }
}

为什么当 Turbolinks 和我的分叉版本都没有使用WebChromeClient时需要这样做,我并不完全理解。

作为一个快速免责声明:我相信您可以让 Turbolinks 在某些情况下正常工作,而这些情况并不能完成我们在服务器端所做的所有事情,但在我们的情况下,这是导致问题的关键。

于 2020-04-24T20:53:06.620 回答