Использование Android Turbolinks Framework, как уменьшить сбои внедрения моста
Я задал этот вопрос на странице Turbolinks GitHub на прошлой неделе, так как продолжал сталкиваться с этой проблемой сбоя инъекции моста.
Проблема носит крайне временный характер и ее очень сложно воспроизвести, но код проблемы заключается в том, что на некоторых устройствах мы видимTurbolinks Bridge Injection Failed
ошибка, и впоследствии наша страница не загружается должным образом.
Здесь слишком много кода для публикации (не говоря уже об ограничениях NDA), но достаточно сказать, что страница загружается на большинстве устройств, а на тех, которые не работают, мы замечаем 401
исключение с нашего сервера из-за неверных данных аутентификации, а затем запускается этот обратный вызов.
Кто-нибудь знает, почему проблема Bridge Injection может возникать на некоторых устройствах, но не на других?
1 ответ
Как оказалось, проблема не в моем коде или турболинках, а напрямую связана с пользователями, у которых установлен браузер Chrome.
Я провёл бесчисленное количество журналов данных и тестов, чтобы подтвердить, но результат таков:
Turbolinks не будет работать должным образом, если устройство:
1) Не установлен Chrome
2) Отключен ли Chrome
3) Имеет устаревшую версию Chrome, требующую обновления (нет конкретной минимальной версии из того, что я мог найти, больше просто общей, обновление должно произойти после X версий).
В любой из трех ситуаций это Bridge Injection Error
загорится, и это, несомненно, причина.
Решение состоит в том, чтобы перенаправить пользователя в магазин Play через его устройство и дать ему указание загрузить, включить или обновить Chrome.
/**
* Open the Google Play store app URL Link
*/
void openChromeAppPlayStoreLink() {
//Try catch logic pulled from - https://stackru.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 нормально работать в некоторых ситуациях, которые не делают все, что мы делали на стороне сервера, но в нашей ситуации это был стержень, который вызывал проблемы.