PushManager.getSubscription()
获取现有的推送订阅。它返回一个 Promise 对象,解析为一个 PushSubscription 对象,其中包含现有订阅的详细信息。如果不存在现有的订阅,则解析为 null 值。
[...]
PushManager.subscribe()
订阅推送服务。它返回一个 Promise 对象,解析为一个 PushSubscription 对象,其中包含推送订阅的详细信息。如果当前服务工作器没有现有的订阅,则创建一个新的推送订阅。
根据 MDN 的 pushManager
文档,这两种方法基本相同,除了在 getSubcription()
的情况下可能会解析为空值。
我的理解是,我可以简单地使用 subscribe()
,Service Worker 将尝试获取订阅(如果可用),并在不可用时创建新的订阅。
=> 但我想做一些不同的事情。我想先尝试获取订阅,如果它解析为空值,我将尝试进行订阅。
navigator.serviceWorker.register('./worker.js')
.then(function(reg) {
// Subscribe push manager
reg.pushManager.getSubscription()
.then(function(subscription) {
if(subscription){
// TODO... get the enpoint here
} else {
reg.pushManager.subscribe()
.then(function(sub){
// TODO... get the endpoint here
});
}
}, function(error) {
console.error(error);
})
});
但是我遇到了以下错误:
Uncaught (in promise) DOMException: 订阅失败 - 没有活跃的服务工作者
这很令人困惑,我怀疑这是Chrome在服务工作者的Push API上的限制,还是可能是一个bug。是否有任何人对这种奇怪的行为有任何信息?