Chrome 桌面通知示例

IT技术 javascript desktop google-chrome notifications
2021-01-22 12:41:53

如何使用Chrome 桌面通知我希望在我自己的代码中使用它。

更新:这是一篇用示例解释 webkit 通知的博客文章

6个回答

在现代浏览器中,有两种类型的通知:

  • 桌面通知- 触发简单,只要页面打开就可以工作,并且可能会在几秒钟后自动消失
  • Service Worker 通知- 有点复杂,但它们可以在后台工作(即使在页面关闭后),是持久的,并且支持操作按钮

API 调用采用相同的参数(除了操作 - 在桌面通知上不可用),这些参数在MDN和服务工作者以及Google 的 Web Fundamentals站点上都有详细记录


下面是Chrome、Firefox、Opera 和 Safari桌面通知的工作示例请注意,出于安全原因,从 Chrome 62 开始,可能不再从跨域 iframe 请求通知 API 的权限,因此我们无法使用 StackOverflow 的代码片段对此进行演示。您需要将此示例保存在站点/应用程序上的 HTML 文件中,并确保使用localhost://或 HTTPS。

// request permission on page load
document.addEventListener('DOMContentLoaded', function() {
 if (!Notification) {
  alert('Desktop notifications not available in your browser. Try Chromium.');
  return;
 }

 if (Notification.permission !== 'granted')
  Notification.requestPermission();
});


function notifyMe() {
 if (Notification.permission !== 'granted')
  Notification.requestPermission();
 else {
  var notification = new Notification('Notification title', {
   icon: 'http://cdn.sstatic.net/stackexchange/img/logos/so/so-icon.png',
   body: 'Hey there! You\'ve been notified!',
  });
  notification.onclick = function() {
   window.open('http://stackoverflow.com/a/13328397/1269037');
  };
 }
}
 <button onclick="notifyMe()">Notify me!</button>

我们正在使用W3C 通知API。不要将此与Chrome扩展通知 API混淆,后者是不同的。Chrome 扩展程序通知显然只适用于 Chrome 扩展程序,不需要用户的任何特殊许可。

W3C 通知适用于许多浏览器(请参阅caniuse 上的支持),并且需要用户许可。作为最佳实践,不要立即请求此许可。首先向用户解释他们为什么需要通知并查看其他推送通知模式

请注意,由于此错误,Chrome 不支持 Linux 上的通知图标

最后的话

通知支持一直在不断变化,在过去几年中,各种 API 被弃用。如果您好奇,请查看此答案的先前编辑以了解过去在 Chrome 中工作的内容,并了解富 HTML 通知的故事。

现在最新的标准是在https://notifications.spec.whatwg.org/

至于为什么有两个不同的调用具有相同的效果,这取决于您是否在服务工作者中 - 请参阅我在 Google 工作时提交的这张票

另请参阅notify.js以获取帮助程序库。

@mghaoui - 流行!= 真的(必须)。我已将此标记为正确答案。
2021-03-22 12:41:53
window.webkitNotifications.checkPermission() 将在非 Chrome 浏览器中抛出异常
2021-03-23 12:41:53
在 Windows 8 上的 Mozilla Fire fox 上工作时,在Chrome 版本 47.0.2526.80 dev-m 中不工作
2021-03-23 12:41:53
关闭不是一种方法。我想你想要 notification.cancel() > decadecity.net/blog/2012/10/12/webkit-notification-api >> 它似乎也自行关闭。
2021-03-30 12:41:53
感谢您的支持,将它与 Pusher 一起使用帮助我构建了通知系统。
2021-04-02 12:41:53

检查设计API 规范(它仍然是一个草案)或检查来自(页面不再可用)的源代码以获取一个简单示例:主要是调用window.webkitNotifications.createNotification.

如果您想要一个更强大的示例(您正在尝试创建自己的 Google Chrome 扩展程序,并且想知道如何处理权限、本地存储等),请查看Gmail 通知程序扩展程序:下载 crx 文件而不是安装它,解压缩并阅读其源代码。

4 年后,这个答案现在已经完全过时了。@RoyiNamir:有通知 API。检查我的答案
2021-03-13 12:41:53
@Royi,有一个 Firefox 扩展,以及迟早会出现的本机 Firefox 实现对于 Internet Explorer,可能的解决方案是要求您网站的用户下载Chrome Frame,因为这将是使通知正常工作的可行解决方案。还有一些其他的 Microsoft 解决方案
2021-03-15 12:41:53
没有任何适用于所有浏览器的东西吗?
2021-03-16 12:41:53
示例链接已失效。
2021-03-24 12:41:53

也可以看看 ServiceWorkerRegistration.showNotification

似乎window.webkitNotifications已被弃用和删除。但是,有一个新的 API,它似乎也适用于最新版本的 Firefox。

function notifyMe() {
  // Let's check if the browser supports notifications
  if (!("Notification" in window)) {
    alert("This browser does not support desktop notification");
  }

  // Let's check if the user is okay to get some notification
  else if (Notification.permission === "granted") {
    // If it's okay let's create a notification
    var notification = new Notification("Hi there!");
  }

  // Otherwise, we need to ask the user for permission
  // Note, Chrome does not implement the permission static property
  // So we have to check for NOT 'denied' instead of 'default'
  else if (Notification.permission !== 'denied') {
    Notification.requestPermission(function (permission) {

      // Whatever the user answers, we make sure we store the information
      if(!('permission' in Notification)) {
        Notification.permission = permission;
      }

      // If the user is okay, let's create a notification
      if (permission === "granted") {
        var notification = new Notification("Hi there!");
      }
    });
  } else {
    alert(`Permission is ${Notification.permission}`);
  }
}

代码笔

我没看到他说他在哪里写的?
2021-03-15 12:41:53
@Miron 请看一下第一段中的超链接。我链接了源代码,然后按照 SO 礼节将代码复制到我的答案中。如果 MDN 不是 wiki,我可能会更明确地说明作者是谁,但我不会假装什么。
2021-03-16 12:41:53
代码笔不起作用
2021-03-30 12:41:53
这不再适用于 Android Chrome:VM121:10 未捕获的类型错误:无法构造“通知”:非法构造函数。请改用 ServiceWorkerRegistration.showNotification()。
2021-04-06 12:41:53
@StepanYakovenko 再次尝试使用 codepen 链接。else在最后添加了一个额外的东西来告诉你问题是什么。您可能像我一样全局禁用通知:\
2021-04-09 12:41:53

我喜欢:http : //www.html5rocks.com/en/tutorials/notifications/quick/#toc-examples但它使用旧变量,所以演示不再工作。webkitNotifications现在是Notification

呵呵。Hakim 是最好的通知人,因为我碰巧为他的演示框架做出了贡献
2021-03-21 12:41:53
那里的 Twitter 示例不再有效。
2021-03-24 12:41:53
你应该告诉html5rocks.com/en/profiles其中一个必须适用于 Twitter =)
2021-04-08 12:41:53

我制作了这个简单的通知包装器。它适用于 Chrome、Safari 和 Firefox。

可能也适用于 Opera、IE 和 Edge,但我还没有测试过。

只需从https://github.com/gravmatt/js-notify获取 notify.js 文件并将其放入您的页面即可。

在 Bower 上获取

$ bower install js-notify

这是它的工作原理:

notify('title', {
    body: 'Notification Text',
    icon: 'path/to/image.png',
    onclick: function(e) {}, // e -> Notification object
    onclose: function(e) {},
    ondenied: function(e) {}
  });

您必须设置标题,但作为第二个参数的 json 对象是可选的。

@eranotzap 我现在在 windows 和 mac 上测试了它。我在屏幕的任何角落都看不到通知,但我听到了通知的声音,在 Mac 上,我在侧边栏中收到了通知(打开了多个选项卡)。Firefox 是新的 Internet Explorer。
2021-03-12 12:41:53
@gravmatt 您是否遇到过 Firefox 的问题,如果打开了多个浏览器窗口,则不会出现通知?
2021-04-01 12:41:53
@eranotzap 它应该适用于多个选项卡。我运行一个项目,这没有问题。但我不确定是否有多个窗口。
2021-04-01 12:41:53
它可以在 Firefox 中的多个选项卡中工作吗?
2021-04-04 12:41:53
我对多个标签有同样的问题
2021-04-06 12:41:53