【问题标题】:How to bring chrome to foreground from a web app如何将 chrome 从 web 应用程序带到前台
【发布时间】:2019-04-04 15:55:21
【问题描述】:

当网站内部发生某些事情时,是否有任何 windows apps/google chrome flags/google chrome extension/javascript methods 或任何其他东西可以让 Chrome 窗口从背景(最小化)到前景。我确实可以访问客户端计算机,如果可能的话,我可以设置 chrome 标志/kiosk 模式或任何会阻止它打开到前台的东西。

例如,当订单进入时,我试图通过通知将窗口置于前台(我正在使用 firebase 消息)。 我尝试在setBackgroundMessageHandler() 中的service worker 中执行window.open(),但我在控制台中出现错误提示window is not defined

如果 chrome 无法实现此目的,创建具有适当权限的 Microsoft Progressive Web App 是否允许我将该窗口从最小化状态带到前台?

【问题讨论】:

  • 你可以创建一个原生的windows应用程序并使用win32 sendmessage/postmessage来聚焦窗口。
  • 你需要在窗口对象上做一个.focus()。但是,如果没有代码示例,就很难知道是什么创建了窗口以及如何获取该窗口对象。如果您正在创建要放在前面的窗口,您可以将window.open() 的结果分配给一个变量(例如var myWindow=window.open(...etc...)),然后使用myWindow.focus() 在该变量上运行.focus()
  • @Mr. Zach 我不知道如何编写原生 Windows 应用程序,pwa 可以工作吗?
  • @Fat Monk 会在 serviceworker 中的 setBackgroundMessageHandler() 中使用 window.open()、window.focus() 吗?
  • setBackgroundMessageHandler() 附加到哪个对象?我猜可能存在对象“范围”/可见性问题,但如果没有看到从哪里以及以什么顺序调用什么,就很难说。窗口最初是从哪里打开的?下单时它是否一直存在,或者如果它不存在,是否需要创建窗口?

标签: javascript google-chrome progressive-web-apps minimize background-foreground


【解决方案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 组件。

【讨论】:

  • 令人兴奋!这适用于Android和iOS吗?我了解 iOS 仍然不支持 PWA 通知?另外,对推送通知感到好奇......通知能否从休眠、未启动状态启动 PWA,即同时启动浏览器和 PWA? Firebase 能否绕过 Apple 向 PWA 发送通知,还是 iOS 仍处于控制之中?或者有没有办法在 iOS 上实现 webhook 来启动 PWA?这可能需要应用程序已经在运行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多