'pushManager.subscribe' 和 'pushManager.getSubscription' Service Worker's 有什么区别



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,如本服务工作者食谱中所述。

最新更新