我有一个接收推送通知的服务工作者,它适用于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,但不会在独立模式下打开。
答案 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);
});