我一直在关注HTML通知和service worker的状态,并且想知道-是否有可能在延迟时显示通知?基本上,我希望能够说"30分钟后提醒我",然后在30分钟后向用户推送通知。这可以立即安排,但我没有看到任何功能允许。
我错过了什么,或者是不可能的(特别是)Chrome api的当前状态?
这是可能的,但对于服务工作者来说并不简单,至少在目前的形式下是这样。这不是直截了当的,因为一个服务工作者不能让自己保持半小时的清醒,或者用setTimeout
或setInterval
唤醒自己。浏览器只会关闭工作线程,不会记录任何超时或间隔。您可以从打开的选项卡中使用消息唤醒它,但是您说您不想必须保持打开的选项卡,并且如果您假设打开了选项卡,那么为什么还要使用service worker呢?正如Jeff Posnick在评论中建议的那样,你可能最终会使用Sync或PeriodicSync api,但是,正如他也指出的那样,它们还没有实现,并且无论如何都不是真正用于此的。
你可以完成你想要的在当前版本的Chrome使用推送API,但你必须包括服务器在循环和设置自己与推送通知服务(即GCM)。它的工作原理大致如下:
- 当你决定延迟通知时,让服务器知道它
- 延迟后,服务器为您的用户发送推送消息
- service worker被唤醒以响应推送并创建一个新的通知
最后一部分将是一个麻烦,因为目前你不能实际发送任何类型的有效载荷与推送,所以你的service worker将需要一些方法来弄清楚通知应该是什么。也许服务器有一个休眠通知列表,service worker可以从那里获取它,或者你可以将它们保存在IndexedDB中。
改编自https://developer.cdn.mozilla.net/media/uploads/demos/e/l/elfoxero/c17223c414d8ddafb7808972b5617d9e/html5-notifications_1400214081_demo_package/:
<script>
var Notification = window.Notification || window.mozNotification || window.webkitNotification;
function show() {
window.setTimeout(function () {
var instance = new Notification("Hello World!");
}, 5000);
return false;
}
</script>
<a href="#" onclick="return show()">Notify me!</a>