Как вывести Chrome на передний план из веб-приложения

#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? Для этого, вероятно, потребуется, чтобы приложение уже было запущено?