Javascript 在没有后端服务器的情况下,如何在24小时后触发桌面通知?

Javascript 在没有后端服务器的情况下,如何在24小时后触发桌面通知?,javascript,notifications,service-worker,client-side,Javascript,Notifications,Service Worker,Client Side,假设: 用户已允许在我的网站上发送通知 服务人员已安装并准备就绪 用户将客户端提醒设置为24小时后提醒 没有后端服务或服务器将通知推送到用户 如果没有后端服务器推送桌面通知,如何触发该通知?这可能吗 如果提供了超时/间隔,且尚未准备好使用,则浏览器将关闭service worker。在将来的某个指定时间,是否没有仅客户端的方法来触发通知 是否存在严格不是“推送通知”的桌面通知?推送通知本质上是从服务器推送的。可以从客户端触发通知吗?我认为目前不可能 推送通知在其摘要中指定: 本文档描述了一个简单

假设:

  • 用户已允许在我的网站上发送通知
  • 服务人员已安装并准备就绪
  • 用户将客户端提醒设置为24小时后提醒
  • 没有后端服务或服务器将通知推送到用户
  • 如果没有后端服务器推送桌面通知,如何触发该通知?这可能吗

    如果提供了超时/间隔,且尚未准备好使用,则浏览器将关闭service worker。在将来的某个指定时间,是否没有仅客户端的方法来触发通知


    是否存在严格不是“推送通知”的桌面通知?推送通知本质上是从服务器推送的。可以从客户端触发通知吗?

    我认为目前不可能

    推送通知在其摘要中指定:

    本文档描述了一个简单的real-
    将事件计时到用户代理。此方案使用HTTP/2服务器推送

    这意味着需要一个支持HTTP/2推送的服务器

    我很喜欢对Javascript大发雷霆,而且我似乎找不到一个可以在浏览器中运行的HTTP2服务器的Javascript实现(node就是这样),这让我感到羞耻,嘲笑它也太棒了


    < P> >,查找名号,HTTP2-Serv.JS不见了。

    你也许可以考虑使用。但是,这只对使用相同设备和浏览器的用户有利

    下面是一个在页面加载时启动的函数。如果希望它在整个会话中定期出现,可以将其包装到
    setInterval
    中并定期检查。这是假设它需要正好是24小时后的毫秒

    // on page load
    window.onload = () => {
        const dayMs = 24*60*60*1000; // 1 day in milliseconds
        const notificationTimer = localStorage.getItem('notificationTimer');
        if(notificationTimer){
            const sendNotification = (Date.now() - (new Date(notificationTimer)).getTime()) > dayMs;
            if(sendNotification){
                const notification = new Notification('Displaying next day reminder from yesterday');
            }
        }
    
    };
    
    当用户选择次日提醒时,您可以设置
    通知计时器

    localStorage.setItem(notificationTimer, Date.now());
    

    您必须对次日提醒不能跨浏览器或设备工作提出一些警告,这可能是可取的,也可能是不可取的。

    在撰写本文时(2019年1月3日):

    没有一种“桌面通知”不是严格意义上的“推送通知”,并且可以跨平台正常工作

    • 如果应用程序不在后台工作,则无法触发“桌面通知”
    • 服务人员不应使用计时器,将被关闭
    • 操作系统或其他实用软件也可能建议甚至关闭您的后台应用程序
    • 在将来的某个精确时间,没有仅客户端的方法来触发通知。目前有太多的理由让组织不允许这种情况发生
    您唯一的选择似乎是使用不同的推送通知服务和外部调度服务,该服务将根据自定义调度触发外部通知

    根据我的理解,您的要求:

    • 每个访问者都需要订阅推送通知
    • 外部记录客户偏好(例如:使用一些云计划)
    • 使用外部计划服务触发推送通知服务
    推送通知是服务器触发的而不是客户端请求的

    推送通知的要点是,您应该从外部触发通知,以避免使用最终用户设备上的资源。这不会阻止您从用户收集通知首选项,请将此信息保存到外部,以便在需要时从外部触发通知

    有关PWA通知的更多信息,请参阅以下文章:

    据我所知,PWA服务人员不应使用计时器

    AS <强>使用PWA通知< /强>的另一种选择,您可能希望正确地考虑使用不同的通知服务。例如FCM

    想法可以是在外部保存用户的通知首选项,并在达到预定时间时通过另一个云服务触发FCM通知

    显然,只有当用户连接到网络时,这些通知才会起作用。然而,对于任何需要网络访问的通知服务来说,情况也是如此


    我希望以上的帮助,干杯和快乐的编码

    假设您网站上的通知数据不会从服务器发送。使用本地存储将是一条出路

    您可以存储一个变量,以帮助跟踪用户访问您的网站时何时显示通知:

    localStorage.setItem("lastNotification", Date.now());
    
    因此,您可以有一个脚本来执行以下操作:

    function notificationHelper(){
        var lastTime = localStorage.getItem("lastNotification");
        if(Date.now - lastTime > 86400000){
    
            //Logic to show notication here
            //set a new time at the end of the logic
    
        }
        //Otherwise Do Nothing
    }
    

    了解“推送”通知。我认为本质上推送通知需要后端服务器来推送。我希望有一个桌面通知,可以在特定的时间触发,作为提醒或警报。我认为服务工作者目前不可能这样做,因为浏览器关闭非活动工作者会忽略超时或间隔。我希望得到证实,也许确实如此。如果你发现了什么,请把它贴出来。当然可以。这是一个很好的选择@Joe,除了我认为OP需要更多的“推送通知”之外一种解决方案-即,即使在用户不浏览网站的情况下也有效的解决方案。Mortz关于即使用户不浏览网站也希望收到通知的说法是正确的。呃,这个答案是社区自动授予的赏金,因为我延迟了选择。我仍然在寻找一种方法来触发24小时后的通知。打开网站不应该是一项要求,但如果浏览器是打开的,也可以。也许有一个br