Обнаружение веб-приложения, работающего в качестве приложения домашнего экрана в Android Stock Browser - PullRequest
0 голосов
/ 19 ноября 2018

Мы создаем веб-приложение, которое должно использоваться как отдельное приложение / приложение для домашнего экрана. В Chrome и Safari мы можем определить, просматривается ли он из браузера или из нативного контейнера браузера с window.navigator.standalone или window.matchMedia('(display-mode: standalone)'). Похоже, что ни один из этих вариантов не работает со стандартным Android-браузером по умолчанию / Интернетом Samsung. Кроме того, мы также не можем использовать start_url в manifest.json, потому что нам нужно передать токен в приложение для домашнего экрана, уникальное для каждого пользователя.

Можно ли определить, открывается ли приложение с домашнего экрана, когда оно было добавлено с помощью стокового браузера Android?

Относящиеся

Ответы [ 2 ]

0 голосов
/ 22 июля 2019

Вот то, что я придумал этим вечером, после того, как ударился головой о все «решения», которые я нашел повсюду, которые просто не работали.Моя теория заключается в том, что панель задач на любом телефоне имеет размер 30px или меньше, поэтому вычтите внутреннюю высоту html из высоты экрана и, если оставить значение 30px или меньше, создайте полноэкранные правила, например ...

     var flScrn = (screen.height - innerHeight );
        if (flScrn < 30) {
            $('.installprompt').css("display","none");
        }
0 голосов
/ 23 декабря 2018

Насколько я могу судить, нет способа напрямую определить, работает ли приложение в браузере Samsung или как отдельное приложение в браузере Samsung.Единственное отличие, которое я смог найти, это window.innerHeight, так как это не относится к адресной строке.С window.screen.height можно было бы потенциально рассчитать коэффициент.Поскольку этот браузер можно использовать на разных устройствах, это не обязательно поможет вам.window.innerHeight должно быть больше для автономных приложений, но вы не обязательно знаете, насколько велико автономное приложение по сравнению с браузером.

// Imperfect solution
if ((window.innerHeight / window.screen.height) > 0.9) {
  // Some probability of this being a standalone app.
}

Другое решение, которое я нашел, состояло в том, чтобы установить манифестфайл через javascript, что позволяет нам установить уникальный токен в стартовом URL для каждого отдельного пользователя.Этот подход имеет несколько недостатков.Установка файла манифеста с помощью javascript технически не поддерживается, и когда вы создаете файл манифеста таким образом, ваше приложение никогда не будет установлено как веб-apk.Firefox вообще не поддерживает динамически генерируемые файлы манифеста, в то время как ios кэширует файл манифеста, который может сам по себе вызвать проблемы.Chrome devtools также не всегда отображает то, что находится в вашем файле манифеста.Следующее частично взято из этой средней статьи .

// This approach has many caveats. Be aware of all of them before using this solution
import manifestBase from '../manifest.json';

const myToken = window.localStorage.getItem('myToken');
const manifest = { ...manifestBase };
manifest.start_url = `${window.location.origin}?standalone=true&myToken=${myToken}`;
const stringManifest = JSON.stringify(manifest);
const blob = new Blob([stringManifest], {type: 'application/json'});
const manifestURL = URL.createObjectURL(blob);
document.querySelector('meta[rel=manifest]').setAttribute('href', manifestURL);

Вы можете обойти проблему с FireFox, установив для атрибута href вашего метатега манифеста разумное значение по умолчанию.Вы не можете обойти проблему в ios, если ваша уникальная информация часто меняется ... или даже вообще.Если ваш стартовый URL не является динамическим, не устанавливайте файл манифеста через javascript вообще, а вместо этого установите стартовый URL с некоторой информацией (например, строка запроса standalone=true выше), которая позволяет отличить автономное приложение от URL браузера.


Еще одна вещь, которую я обнаружил, заключается в том, что установка режима браузера на что-либо еще, например fullscreen, не «исправляет» ошибку в браузере Samsung.Он никогда не установит режим отображения на что-либо, кроме браузера, поэтому его невозможно обнаружить таким же образом.

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