事实证明,问题不在于我的代码或 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 在某些情况下正常工作,而这些情况并不能完成我们在服务器端所做的所有事情,但在我们的情况下,这是导致问题的关键。