我正在尝试发送网络推送通知,一切正常。但现在我遇到了一个问题。我不知道为什么,但服务工作者正在向所有人发送旧消息。
服务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文件。我不肯定。但我无法向订阅者发送新消息。请帮帮我。
请帮帮我。
谢谢!
答案 0 :(得分:0)
目前更新服务工作者并不容易。
我在Pushpad博客上写了很多关于更新服务工作者的文章:
基本上你需要:
- 访问网站页面(激活服务工作者或致电serviceWorker.register) - 有时您还需要刷新该页面
- 现在安装了新的服务工作者,但是在终止上一个服务工作者之前无法激活它:关闭并重新打开浏览器
醇>
答案 1 :(得分:0)
您有三种机制来更新服务工作者:
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