Использование 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 нормально работать в некоторых ситуациях, которые не делают все, что мы делали на стороне сервера, но в нашей ситуации это был стержень, который вызывал проблемы.

Другие вопросы по тегам