В чем разница между работниками службы pushManager.subscribe и pushManager.getSubscription?

PushManager.getSubscription()

Извлекает существующую принудительную подписку. Он возвращает обещание, которое преобразуется в объект PushSubscription, содержащий сведения о существующей подписке. Если существующей подписки не существует, это разрешается в нулевое значение.

[...]

PushManager.подписать()

Подписывается на услугу push-уведомлений. Он возвращает обещание, которое разрешается в объект 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 (в обещании) DOMException: подписка не удалась - нет активного сервисного работника

Это сбивает с толку, и я сомневаюсь, что это ограничение Chrome на Push API Service Worker или, возможно, ошибка. Есть ли у кого-нибудь информация об этом странном поведении?


person Linh Pham    schedule 15.04.2016    source источник


Ответы (1)


Проблема в том, что ваш сервис-воркер зарегистрирован, но еще не активен.

Вы можете использовать navigator.serviceWorker.ready вместо подписки сразу после регистрации сервис-воркера.

Если вы хотите активировать сервис-воркер как можно скорее, вы можете использовать skipWaiting и Clients.claim , как описано в этом рецепте ServiceWorker Cookbook.

person Marco Castelluccio    schedule 15.04.2016