如何从service worker获取通知
How to get notification from service worker
我想创建浏览器通知。但是我想按照下面的方式:
- 我想为浏览器创建service worker。
- Service worker每隔60分钟就会向我服务器上的web api发出请求。 通过使用服务器响应,service worker将创建通知。
- 通知将在客户端工作。
这个方案可行吗?
试试这样做…请务必阅读代码中的注释。
这是服务工作者your-service-worker.js
。
self.addEventListener('install', function(event) {
console.log("Service Worker installed");
event.waitUntil(self.skipWaiting());
});
self.addEventListener('activate', function(event) {
console.log("Service Worker activated");
event.waitUntil(self.skipWaiting());
});
self.addEventListener('message', function(event) {
console.log("Service Worker message event: " + JSON.stringify(event.data));
var sender = ( event.ports && event.ports[0] ) || event.source;
switch (event.data) {
case 'fetchNotifications': {
// send notifications when client is ready
sender.postMessage("Here are your queued notifications!");
break;
}
// case 'command': // handle some command, respond
default: {
if(sender)
sender.postMessage("Unknown command: " + event.data);
break;
}
}
});
console.log("Service Worker initialized");
setInterval(function() {
// request to your API
// create notification
// queue to send to client
}, 60*60*1000);
在你的网页中,你必须安装并与service worker对话。你必须与service worker对话,因为多个客户端页面可以被注册到同一个service worker中。
这是你要安装并与service worker通信的JavaScript。
if ('serviceWorker' in navigator) {
var serviceWorkerLocation = '/your-service-worker.js';
navigator.serviceWorker
.register(serviceWorkerLocation)
.then(function() {
console.log("Service worker is registered.");
if (!navigator.serviceWorker.controller) {
console.log("Service worker needs to be activated.");
//location.reload(); // you may choose to reload to sync up with a version change of the service worker
} else {
console.log("Service worker is active.");
// setTimeout(function() { serviceWorkerVersionCheck(true); },250); // you might need to check it's version
}
});
} else {
// panic, fall back, etc.
}
function serviceWorkerRequest(message) {
if ('serviceWorker' in navigator) {
if ( navigator.serviceWorker.controller == null ) {
return Promise.reject("No service worker controller.");
}
return new Promise(function(resolve, reject) {
var messageChannel = new MessageChannel();
messageChannel.port1.onmessage = function(event) {
if (event.data.error) {
reject(event.data.error);
} else {
resolve(event.data);
}
};
navigator.serviceWorker.controller.postMessage(message, [messageChannel.port2]);
});
} else {
return Promise.reject("No service worker.");
}
}
然后你会调用serviceWorkerRequest('fetchNotifications')
或serviceWorkerRequest('listenForNotifications')
等…
您可以使用Worker
。每隔60分钟给员工发一条信息。Worker执行请求,向文档发送消息。
var worker = new Worker("/path/to/worker.js");
worker.addEventListener("message", function(e) {
console.log(e.data);
if (e.data.constructor.name === "Error") {
clearInterval(interval);
console.log(e.data.message)
}
});
worker.postMessage("request"); // make first post to worker
var interval = null;
var duration = 1000 * 60 * 60;
interval = setInterval(function() {
worker.postMessage("request")
}, duration);
在worker.js self.addEventListener("message", function(e) {
if (e.data === "request") {
var request = fetch("/path/to/api");
request.then(function(response) {
return response.text()
})
.then(function(data) {
self.postMessage(data)
})
.catch(function(err) {
self.postMessage(new Error(err))
})
}
});
相关文章:
- 如何安全地获取&使用Facebook应用程序访问令牌发送通知使用PHP&Javascript
- 无法使用 ngCordova 在 Android 中获取推送通知
- 如何从 API 获取未见/未读通知计数
- 如何将数据(如用户 ID)传递给 Web 工作人员,以便从服务器获取其他推送通知数据
- 通过通知 URL 在 Meteor 中获取 POST 请求
- 如何从eBay通知中获取数据
- 将文件添加到目录时,在node.js中获取通知
- 如何使用Express、AngularJS、Socket.io广播和获取通知
- 如何使用vert获取服务器通知(推送通知)到客户端.X Java api
- 浏览器推送通知获取文本
- 如何将函数中的文本获取到此通知警报中
- Ajax/php获取最新数据通知
- Phonegap推送通知获取设备ID
- 如何从service worker获取通知
- Chrome远程调试-获取页面通知
- 获取JavaScript中引用更改的通知
- 用户注册时获取实时通知
- 添加 DOM 元素时获取通知
- Jquery在页面加载时获取桌面通知
- JavaScript:加载空iframe时获取通知