Android Service Worker clients.openWindow从清单而不是请求的url打开启动url

Android Service Worker clients.openWindow从清单而不是请求的url打开启动url,android,google-chrome,service-worker,web-push,Android,Google Chrome,Service Worker,Web Push,我有一个接收推送通知的服务人员,它在Chrome桌面版上运行良好,但在Chrome Android版上运行不好 有时它会按预期工作,但有时它会开始打开manifest.json的start_url值,而不是notificationURL变量的值 通知URL如下所示: 清单开始url值如下所示: 示例代码: self.addEventListener('notificationclick', function(event) { var notificationURL = event.

我有一个接收推送通知的服务人员,它在Chrome桌面版上运行良好,但在Chrome Android版上运行不好

有时它会按预期工作,但有时它会开始打开manifest.json的start_url值,而不是notificationURL变量的值

通知URL如下所示:

清单开始url值如下所示:

示例代码:

self.addEventListener('notificationclick', function(event) {

    var notificationURL = event.notification.data.url;

    event.notification.close();

    event.waitUntil(clients.matchAll({
        type: 'window'
    }).then(function(clientList) {

        for ( var i = 0; i < clientList.length; i++ ) {
            var client = clientList[i];
            if ( client.url === notificationURL && 'focus' in client ) {
                return client.focus();
            }
        }

        if ( 'openWindow' in clients ) {

            // This prints "notificationURL: https://www.example.com/abc/123/?source=notification".
            console.log('notificationURL:', notificationURL);

            // But this opens "https://www.example.com/?source=manifest".
            return clients.openWindow(notificationURL);
        }

    }));

});
self.addEventListener('notificationclick',函数(事件){
var notificationURL=event.notification.data.url;
event.notification.close();
event.waitill(clients.matchAll({
键入:“窗口”
}).then(函数(客户端列表){
对于(var i=0;i
因此,出于某种原因,在某些情况下,如果通知URL以“”开头,则上面的代码将始终打开

这与我将网站添加到主屏幕有关

这是预期的行为吗


注意:它打开清单开始url,但不是在独立模式下。

我遇到了一个类似的问题(或者实际上似乎正好相反):当我只有浏览器处理时,推送通知中的clients.openwindow工作得很好。所以没有任何问题

然而,一旦有人使用“添加到主屏幕”安装了独立应用程序,它就不再工作了。无论我提供了哪个url,应用程序都将始终打开start_url。我什么都试过了;更改清单和serviceworker中的作用域,在openWindow承诺实现后,不顾一切地尝试在窗口上调用navigate()(the.then()甚至没有被称为wtf),等等。我想我已经阅读了整个internet上关于这个主题的文章,但我没有找到解决方案

最后,我决定将清单中的“display:“standalone”改为“display:“browser”。链接又起作用了!当然,这会改变你的应用程序的行为,使其不再那么实用(它更像是网页的快捷方式),但对我来说,这是一个可以接受的解决问题的方法


我觉得现在不支持在安装的独立应用程序中打开页面。如果有人有其他想法,我洗耳恭听;-)

就在返回client.focus()之前

添加这一行

client.navigate(notificationURL)

而且, 更改
return clients.openWindow(notificationURL)

return clients.openWindow(notificationURL)。然后(function(client){
client.navigate(notificationURL);

});

我找到了另一种解决方法。如果我试图打开的URL具有与start\u URL相同的架构和主机,它将打开start\u URL。但是如果我将模式(https)更改为http,它将打开正确的URL,并且我的服务器将重定向到https。但这会带来一些安全问题。。。