8

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 的限制,或者可能是一个错误。有没有人有关于这种奇怪行为的任何信息?

4

1 回答 1

8

问题是您的服务人员已注册,但尚未激活。

您可以使用navigator.serviceWorker.ready而不是在注册服务工作者后立即订阅。

如果您想尽快使服务工作者处于活动状态,您可以使用skipWaitingClients.claim,如本 ServiceWorker Cookbook recipe中所述。

于 2016-04-15T10:57:14.127 回答