PushManager.getSubscription()
检索现有的推送订阅。它返回一个Promise,该Promise解析为包含现有订阅详细信息的PushSubscription对象。如果不存在现有订阅,则解析为null值。
[…]
PushManager.subscribe()
订阅推送服务。它返回一个Promise,该Promise解析为包含推送订阅详细信息的PushSubscription对象。如果当前服务工作者没有现有订阅,则会创建新的推送订阅。
根据MDN的pushManager
文件。除了在getSubcription()
的情况下,可以使用null值来解析外,其他方法几乎相同。
我基本上明白,我可以简单地使用subscribe()
,Service Worker会在订阅可用的情况下尝试获得订阅,在订阅不可用的情况下来创建新的订阅。
=>但我想做点别的。我想先尝试订阅,如果用null
解决,我会尝试订阅。
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);
})
});
但后来我就出现了错误:
未捕获(承诺中)DOMException:订阅失败-没有活动的Service Worker
这很令人困惑,我怀疑这是Chrome对Service Worker的Push API的限制,或者可能是一个bug。有人知道这种奇怪的行为吗?
问题是您的服务工作者已注册,但尚未处于活动状态。
您可以使用navigator.serviceWorker.ready,而不是在注册服务工作者后立即订阅。
如果您想尽快激活服务工作者,可以使用skipWaiting和Clients.claim,如本服务工作者食谱中所述。