2

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

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

通知 URL 如下所示: 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);
        }

    }));

});

因此,由于某些原因,如果通知 URL 以“ https://www.example.com ”开头,则上面的代码将始终打开https://www.example.com/?source=manifest

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

这是预期的行为吗?

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

4

2 回答 2

2

就在之前return client.focus();

添加这一行

client.navigate(notificationURL);

还有,改变return clients.openWindow(notificationURL)

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

于 2017-09-02T07:32:17.120 回答
1

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

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

最后,我决定在清单中将 'display: "standalone"' 更改为 'display: "browser"'。链接再次起作用!当然,这会将您的应用程序的行为改变为不再适用(它变得更像是网页的快捷方式),但对我来说,这是解决问题的可接受的解决方法。

我感觉目前不支持在您安装的独立应用程序中打开页面。如果有人有其他想法,我会全神贯注;-)

于 2016-07-01T10:12:02.483 回答