服务工作者正在向订阅者发送旧消息

时间:2017-06-23 14:43:21

标签: javascript push-notification service-worker web-push

我正在尝试发送网络推送通知,一切正常。但现在我遇到了一个问题。我不知道为什么,但服务工作者正在向所有人发送旧消息。

服务worker.js

const applicationServerPublicKey = 'BFcmZ847NIPORvhzARrLcIFfShkxnHGsiKSlYvUe0WaPNHFHGH3FXRWwunSHjktJgcunbtteTu_xmDw6iugygic';

/* eslint-enable max-len */

function urlB64ToUint8Array(base64String) {
  const padding = '='.repeat((4 - base64String.length % 4) % 4);
  const base64 = (base64String + padding)
    .replace(/\-/g, '+')
    .replace(/_/g, '/');

  const rawData = window.atob(base64);
  const outputArray = new Uint8Array(rawData.length);

  for (let i = 0; i < rawData.length; ++i) {
    outputArray[i] = rawData.charCodeAt(i);
  }
  return outputArray;
}

self.addEventListener('push', function(event) {
    self.skipWaiting();

  console.log('[Service Worker] Push Received.');
  console.log(`[Service Worker] Push had this data: "${event.data.text()}"`);

  const title = 'Example Website';
  const options = {
    body: 'Content',
    icon: 'http://www.example.com/icon.jpg',
    "image": "http://www.example.com/img.jpg",
    };

  event.waitUntil(self.registration.showNotification(title, options));
});

self.addEventListener('notificationclick', function(event) {
  console.log('[Service Worker] Notification click Received.');

  event.notification.close();

  event.waitUntil(
    clients.openWindow('http://www.example.com')
  );
});

self.addEventListener('pushsubscriptionchange', function(event) {
  console.log('[Service Worker]: \'pushsubscriptionchange\' event fired.');
  const applicationServerKey = urlB64ToUint8Array(applicationServerPublicKey);
  event.waitUntil(
    self.registration.pushManager.subscribe({
      userVisibleOnly: true,
      applicationServerKey: applicationServerKey
    })
    .then(function(newSubscription) {
      // TODO: Send to application server
      console.log('[Service Worker] New subscription: ', newSubscription);
    })
  );
});

我认为浏览器缓存这个静态JS文件。我不肯定。但我无法向订阅者发送新消息。请帮帮我。

请帮帮我。

谢谢!

2 个答案:

答案 0 :(得分:0)

目前更新服务工作者并不容易。

我在Pushpad博客上写了很多关于更新服务工作者的文章:

基本上你需要:

  
      
  1. 访问网站页面(激活服务工作者或致电serviceWorker.register) - 有时您还需要刷新该页面
  2.   
  3. 现在安装了新的服务工作者,但是在终止上一个服务工作者之前无法激活它:关闭并重新打开浏览器
  4.   

答案 1 :(得分:0)

您有三种机制来更新服务工作者:

  • 更新serviceworker脚本;甚至评论都会这样做,并访问由服务工作者控制的页面。此更新将在serviceworker文件的后台触发下载,如果有任何差异,您将进入serviceworker的更新生命周期:https://developers.google.com/web/fundamentals/getting-started/primers/service-workers#update-a-service-worker
  • 另一种选择是取消注册并重新注册服务人员。
  • 最后一个选项是调用public View getView(int i, View view, ViewGroup viewGroup){ LayoutInflater linflater = getLayoutInflater(); View view1 = linflater.inflate(R.layout.row_view, null); final EditText replyfld = (EditText) view1.findViewById(R.id.replyfld); final Button sendreplybtn = (Button)view1.findViewById(R.id.sendreplybtn); sendreplybtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String thereplyvalue = replyfld.getText().toString(); Toast.makeText(MessagesActivity.this, thereplyvalue, Toast.LENGTH_SHORT).show(); } }); } 方法,但不幸的是,今天只在Firefox中实现:https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/update