Android Service Worker clients.openWindow从清单而不是请求的url打开启动url
我有一个接收推送通知的服务人员,它在Chrome桌面版上运行良好,但在Chrome Android版上运行不好 有时它会按预期工作,但有时它会开始打开manifest.json的start_url值,而不是notificationURL变量的值 通知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.
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。但这会带来一些安全问题。。。