`pushManager.subscribe`和`pushManager.getSubscription`在服务工作者中有什么区别?

8

PushManager.getSubscription()

获取现有的推送订阅。它返回一个 Promise 对象,解析为一个 PushSubscription 对象,其中包含现有订阅的详细信息。如果不存在现有的订阅,则解析为 null 值。

[...]

PushManager.subscribe()

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

根据 MDN 的 pushManager 文档,这两种方法基本相同,除了在 getSubcription() 的情况下可能会解析为空值。

我的理解是,我可以简单地使用 subscribe(),Service Worker 将尝试获取订阅(如果可用),并在不可用时创建新的订阅。

=> 但我想做一些不同的事情。我想先尝试获取订阅,如果它解析为空值,我将尝试进行订阅。

    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: 订阅失败 - 没有活跃的服务工作者

这很令人困惑,我怀疑这是Chrome在服务工作者的Push API上的限制,还是可能是一个bug。是否有任何人对这种奇怪的行为有任何信息?

1个回答

8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接