`pushManager.subscribe`和`pushManager.getSubscription` Service Worker之间有什么区别?

时间:2016-04-15 07:45:47

标签: google-chrome service-worker progressive-web-apps push-api

  

PushManager.getSubscription()

     

检索现有推送订阅。它返回一个Promise,它解析为包含现有订阅详细信息的PushSubscription对象。如果不存在现有订阅,则会解析为空值。

[...]

  

PushManager.subscribe()

     

订阅推送服务。它返回一个Promise,它解析为一个PushSubscription对象,其中包含推送订阅的详细信息。如果当前服务工作者没有现有订阅,则会创建新的推送订阅。

根据MDN的pushManager文档。除了在getSubcription()的情况下它可以用空值解析之外,方法几乎相同。

我基本上明白我可以简单地使用subscribe(),而服务工作者会尝试在订阅时获取订阅,并且如果订阅不可用,也会创建新订阅。

=>但我正在尝试做别的事情。我想首先尝试订阅,如果用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:订阅失败 - 没有活动的服务工作者

令人困惑,我怀疑这是服务工作者的推送API上Chrome的限制,或者可能是一个错误。有没有人有关于这种奇怪行为的任何信息?

1 个答案:

答案 0 :(得分:7)

问题是您的服务工作者已注册,但尚未激活。

注册服务工作者后,您可以使用navigator.serviceWorker.ready代替订阅。

如果您希望尽快激活服务工作者,可以使用skipWaitingClients.claim,如this ServiceWorker Cookbook recipe中所述。