Я думаю, что вы уже знаете ответ на свой вопрос, вы перечислили все доступные API и события с их минусами, но, похоже, вы ищете подтверждение
Так что да, есть нет способ узнать с точностью 100% , если PWA установлен, поскольку для него нет API
Однако упомянутые вами события дополняют друг друга, так что с комбинацией из них вы можете быть довольно близко
let isInstalled = localStorage.getItem('pwaInstalled') === '1' || false;
if (window.matchMedia('(display-mode: standalone)').matches || window.navigator.standalone === true) {
// User is currently navigating on the PWA so yes it's installed
localStorage.setItem('pwaInstalled', '1');
isInstalled = true;
} else {
//User is navigating in browser
window.addEventListener('beforeinstallprompt', () => {
localStorage.setItem('pwaInstalled', '0');
isInstalled = false;
//User can get an installation prompt meaning the app is not installed
});
window.addEventListener('onappinstalled', () => {
localStorage.setItem('pwaInstalled', '1');
isInstalled = true;
});
}
Таким образом, у вас есть флаг pwaInstalled в локальном хранилище, сообщающий вам, установлено приложение или нет, если данные снят, флаг будет потерян, но в следующий раз, когда пользователь посетит PWA или браузер, этот флаг можно будет снова правильно установить в хранилище
Если пользователь удаляет приложение и посещает браузер, флаг будет удалено
Обратите внимание, что beforeinstallprompt event
является экспериментальным (почти как все в PWA), он не запускается / не существует в некоторых браузерах, которые поддерживают установку PWA и может быть не совсем точным в других ( некоторые могут запустить его, даже если приложение уже установлено ). Оно также не будет срабатывать в течение 90 дней, если пользователь отклонил его
Однако, поскольку для отображения модальной кнопки / кнопки A2HS вы полагаетесь на beforeinstallprompt event
. Не должно иметь значения, если он не срабатывает, оставляя только проблему, если он срабатывает, когда PWA уже установлен (я бы предложил проверить все поддерживаемые браузеры с различными версиями android, если вам нужно определить, какие из них не ' t)
В заключение, если предположить, что событие beforeinstallprompt
запускает точно , тогда вы должны иметь , близкую к 100% точности, независимо от того, установлено приложение или нет