Используя Android Turbolinks Framework, как я могу уменьшить сбои внедрения моста - PullRequest
0 голосов
/ 24 апреля 2020

Я задал этот вопрос на странице Turbolinks GitHub на прошлой неделе, так как я продолжал сталкиваться с проблемой сбоя при инжекции моста.

Проблема является чрезвычайно неустойчивой и очень сложной для воспроизведения, но код проблемы заключается в том, что на некоторых устройствах мы видим ошибку Turbolinks Bridge Injection Failed, и наша страница впоследствии не может загрузить правильно.

Слишком много кода для публикации здесь (не говоря уже об ограничениях NDA), но достаточно сказать, что страница загружается на большинстве устройств и на тех, которые не работают, мы замечаем 401 исключение из нашего сервера из-за неверных данных аутентификации, а затем этот обратный вызов срабатывает.

Кто-нибудь знает, почему проблема Bridge Injection возникает на некоторых устройствах, но не на других?

1 Ответ

0 голосов
/ 24 апреля 2020

Как выясняется, проблема заключается не в моем коде и не в турболинках, а напрямую связана с пользователями, у которых установлен браузер Chrome.

Я запустил бесчисленные журналы данных и тесты для подтверждения, но в результате получилось следующее:

Турболинки не будут работать должным образом, если устройство :

1) Не установлено Chrome

2) Имеется Chrome Отключено

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

Как быстрый отказ от ответственности : Я уверен, что вы можете заставить Turbolink работать нормально в некоторых ситуациях, которые не делают всего, что мы делали на стороне сервера, но в нашей ситуации это было Линч, который вызывал проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...