Насколько я могу судить, нет способа напрямую определить, работает ли приложение в браузере 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.Он никогда не установит режим отображения на что-либо, кроме браузера, поэтому его невозможно обнаружить таким же образом.