PushManager.getSubscription()
检索现有的推送订阅。它返回一个 Promise,该 Promise 解析为包含现有订阅详细信息的 PushSubscription 对象。如果不存在现有订阅,则这将解析为空值。
[...]
PushManager.subscribe()
订阅推送服务。它返回一个 Promise,该 Promise 解析为包含推送订阅详细信息的 PushSubscription 对象。如果当前服务工作者没有现有订阅,则会创建一个新的推送订阅。
根据 MDN 的pushManager
文档。方法几乎相同,只是在这种情况下getSubcription()
可能会用空值解决。
我基本上明白我可以简单地使用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);
})
});
但后来我遇到了错误:
Uncaught (in promise) DOMException: Subscription failed - no active Service Worker
这令人困惑,我怀疑这是 Chrome 对 Service Worker 推送 API 的限制,或者可能是一个错误。有没有人有关于这种奇怪行为的任何信息?