getSubscription返回空订阅

Sri*_*vas 4 javascript service-worker push-api

我是服务工作者和GAE的新手,我能够注册服务工作者,但无法订阅PushManager,但得到的订阅为null错误。查找以下代码以供参考。

serviceWorkerRegistration.pushManager.getSubscription()  
  .then(function(subscription) {  
    var pushButton = document.querySelector('.js-push-button');  
    pushButton.disabled = false;

    if (!subscription) {  
      console.log('subscription error '); 
      return;  
    }
    console.log('subscriptioned ');

    // Keep your server in sync with the latest subscriptionId
    sendSubscriptionToServer(subscription);

    // Set your UI to show they have subscribed for  
    // push messages  
    pushButton.textContent = 'Disable Push Messages';  
    isPushEnabled = true;  
  })  
  .catch(function(err) {  
    console.warn('Error during getSubscription()', err);  
  });
});
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,那么内部的“订阅”值为“ null”,因此控制进入if块并简单地返回。

Mar*_*rco 5

最初,当用户未订阅时,所返回的承诺将getSubscription解析为null。您需要致电registration.pushManager.subscribe以订阅该用户(然后,该用户下次访问您的站点时,getSubscription将以非空订阅进行解析)。

ServiceWorker Cookbook上有很多示例。

一个简单的例子在这里:

// Use the PushManager to get the user's subscription to the push service.
serviceWorkerRegistration.pushManager.getSubscription()
.then(function(subscription) {
  // If a subscription was found, return it.
  if (subscription) {
    return subscription;
  }

  // Otherwise, subscribe the user (userVisibleOnly allows to specify
  // that we don't plan to send notifications that don't have a
  // visible effect for the user).
  return serviceWorkerRegistration.pushManager.subscribe({
    userVisibleOnly: true
  });
})
.then(function(subscription) {
  // Here you can use the subscription.
Run Code Online (Sandbox Code Playgroud)

  • 您可以将其简化为`registration.pushManager.subscribe(...)。then(subscription => ...)`。如果有订阅,subscribe()将返回现有订阅,因此不需要首先调用getSubscription()。 (3认同)