Service Worker clients.openWindow从清单而不是请求的URL打开start_url

时间:2016-05-17 19:14:45

标签: android google-chrome service-worker web-push

我有一个接收推送通知的服务工作者,它适用于Chrome桌面版,但不适用于Android版Chrome。

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

通知网址如下所示: https://www.example.com/abc/123/?source=notification

清单start_url值如下所示: https://www.example.com/?source=manifest

示例代码:

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);
        }

    }));

});

因此,出于某种原因,在某些情况下,如果通知网址以“https://www.example.com”开头,则上述代码将始终打开https://www.example.com/?source=manifest

这与我将网站添加到主屏幕的事实有关吗?

这是预期的行为?

注意:它会打开清单start_url,但不会在独立模式下打开。

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题(或者实际上它似乎正好相反):当我只有浏览器处理时,来自我的推送通知的clients.openwindow工作得很好。所以http://example.com/some/path/page被打开没有任何问题。

然而,只要有人使用“添加到主屏幕”安装独立应用程序,它就不再有用了。无论我提供哪个URL,应用程序都会始终打开start_url。我尝试了一切;改变我的清单和服务工作者的范围,在openWindow承诺完成后,绝望的尝试在窗口上调用navigate()(.then()甚至没有被称为wtf),等等。我想我已经读过了关于这个主题的整个互联网到现在,但我没有找到解决方案...

最后,我决定在我的清单中将'display:'独立“'更改为'display:”浏览器“'。这些链接又恢复了!当然,这会改变您的应用程序的行为,使其不再是非常适合(它变得更像是网页的快捷方式),但对我来说,这是解决问题的可接受的解决方法。

我觉得目前不支持在已安装的独立应用中打开一个页面。如果有人有一个想法,否则我会全神贯注; - )

答案 1 :(得分:1)

return client.focus();

之前

添加此行

client.navigate(notificationURL);

另外, 更改return clients.openWindow(notificationURL)

return clients.openWindow(notificationURL).then(function(client){ client.navigate(notificationURL); });