8

PushManager.getSubscription()

既存のプッシュ サブスクリプションを取得します。既存のサブスクリプションの詳細を含む PushSubscription オブジェクトに解決される Promise を返します。既存のサブスクリプションが存在しない場合、これは null 値に解決されます。

[...]

PushManager.subscribe()

プッシュ サービスにサブスクライブします。プッシュ サブスクリプションの詳細を含む PushSubscription オブジェクトに解決される Promise を返します。現在の Service Worker に既存のサブスクリプションがない場合は、新しいプッシュ サブスクリプションが作成されます。

pushManagerMDN のドキュメントによると。メソッドはほとんど同じですがgetSubcription()、null 値で解決される可能性がある点が異なります。

私は基本的に、単に使用できることを理解してsubscribe()おり、Service Worker は利用可能な場合はサブスクリプションを取得しようとし、利用できない場合は新しいサブスクリプションを作成します。

=>しかし、私は別のことをしようとしていました。nullI will tr​​y to subscribe itで解決した場合は、最初にサブスクリプションを取得してみます。

    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: サブスクリプションが失敗しました - アクティブな Service Worker がありません

紛らわしいので、これが Service Worker の Push API での Chrome の制限であるか、バグである可能性があるのではないかと疑っています。この奇妙な振る舞いについて何か情報を持っている人はいますか?

4

1 に答える 1

8

問題は、Service Worker が登録されているが、まだアクティブになっていないことです。

Service Worker を登録した直後にサブスクライブする代わりに、navigator.serviceWorker.readyを使用できます。

Service Worker をできるだけ早くアクティブにしたい場合は、この ServiceWorker Cookbook レシピで説明されているように、skipWaitingClients.claimを使用できます。

于 2016-04-15T10:57:14.127 に答える