#javascript #google-chrome #progressive-web-apps #minimize #background-foreground
#javascript #google-chrome #progressive-веб-приложения #свернуть #фон-передний план
Вопрос:
Есть ли что- windows apps/google chrome flags/google chrome extension/javascript methods
или любая другая вещь, которая позволила бы вывести окно Chrome из фона (свернутого) на передний план, когда что-то происходит внутри веб-сайта. У меня есть доступ к клиентскому компьютеру, я мог бы установить флаги Chrome / режим киоска или что-нибудь, что помешало бы его открытию на передний план, если это возможно.
Например, я пытаюсь вывести окно на передний план при поступлении заказа через уведомление (я использую сообщения firebase). Я попытался сделать window.open()
в setBackgroundMessageHandler()
в service worker
, но я получаю сообщение об ошибке в консоли, говорящее window is not defined
Если для Chrome нет ничего доступного для достижения этого, позволит ли мне создание Microsoft Progressive Web App с соответствующими разрешениями вывести это окно на передний план из свернутого состояния?
Комментарии:
1. Вы могли бы создать собственное приложение Windows и использовать win32 sendmessage / postmessage для фокусировки окна.
2. Вам нужно сделать
.focus()
для объекта window. Однако без примера вашего кода трудно понять, что создает окно и как вы могли бы получить доступ к этому объекту window. Если вы создаете окно, которое хотите вывести на передний план, вы должны присвоить результатwindow.open()
переменной (напримерvar myWindow=window.open(...etc...)
), а затем запустить.focus()
для этого с помощьюmyWindow.focus()
.3. @Mr. Zach Я не знаю, как закодировать собственное приложение для Windows, будет ли работать pwa?
4. @Fat Monk бы window.open(), окно. focus() работает из setBackgroundMessageHandler() в serviceworker?
5. К какому объекту
setBackgroundMessageHandler()
прикреплен? Я предполагаю, что могут возникнуть проблемы с областью видимости объекта, но, не видя, что вызывается откуда и в какой последовательности и т.д., Трудно сказать. Откуда изначально открывается окно? Всегда ли он уже существует, когда поступает заказ, или вам нужно создать окно, если оно еще не существует?
Ответ №1:
Я решил это, добавив это в файл service worker:
self.addEventListener('push', function (e) {
if (e.data) {
var payloadData = e.data.json();
self.clients.matchAll({includeUncontrolled: true}).then(function (clients) {
clients[0].postMessage(payloadData); // you can do foreach but I only needed one client to open one window
});
}
});
И это в main.js файл:
function openNotificationWindow(url) {
var myWindow = window.open(url); // Opens a new window
myWindow.focus();
myWindow.location.reload(true);
}
navigator.serviceWorker.addEventListener('message', function (event) {
if (typeof event.data.data !== 'undefined') {
openNotificationWindow(url);
}
});
Теперь каждый раз, когда я отправляю уведомление либо с окном на переднем плане, либо в фоновом режиме, push
событие срабатывает в serviceworker, а затем используется postMessage()
для связи с некоторыми main.js файл, в котором у вас есть доступ к window
компоненту DOM.
Комментарии:
1. Захватывающе! Работает ли это как для Android, так и для iOS? Я понимаю, что iOS по-прежнему не поддерживает уведомления для PWA? Отдельно интересно узнать о push-уведомлениях… Может ли уведомление запускать PWA из неактивного, неактивированного состояния, т. Е. Запускать браузер и PWA одновременно? Может ли Firebase обойти Apple для доставки уведомлений в PWA или iOS все еще контролирует ситуацию? Или есть способ реализовать webhooks на iOS для запуска PWA? Для этого, вероятно, потребуется, чтобы приложение уже было запущено?