1

我正在尝试做一个类似 gmail 类型的桌面通知。我面临在 chrome 中更改通知权限的困难。如果我使用window.Notification.permission ,控制台中的权限总是显示拒绝. 如果我从“不允许任何网站显示桌面通知”中手动更改谷歌浏览器设置 -> 隐私 -> 内容设置 -> 通知中的权限为“允许所有网站显示桌面通知”。现在我可以正常获得桌面通知了。但是如果浏览器设置为“不允许任何站点显示桌面通知”,我需要一个询问权限的警报,然后我需要从弹出窗口中选择允许以将设置更改为“允许所有站点显示桌面”通知”。问题是如果我这样做,即使权限警报没有出现,权限也不会改变。权限检查脚本如下

if(Notification.permission == 'denied'){
                 Notification.requestPermission(function (status){
                        console.log("Reaching here");
                        Notification.permission = status;
                     });
            }

未出现请求允许或禁止通知的弹出窗口。提前感谢您向我提出解决方案。

4

2 回答 2

5

你的脚本似乎有问题。

这是标准的一部分,当permission设置为时,denied您永远不能显示询问“您要允许...发送桌面通知吗?”的弹出窗口。此弹出窗口仅在permission设置为的情况下使用default,这实际上意味着用户不在乎,您应该问他是否想要它们。

这是我使用的条件:

Notification['permission'] !== 'granted' && Notification['permission'] !== 'denied'

因为default并非所有浏览器都支持该值。另外,该permission属性在 chrome 32 之前没有实现,这就是为什么您应该使用方括号访问它的原因。

事实上,您也可以删除denied我的条件中的部分,因为如果权限被拒绝,它不会做任何事情。您可以参考此 MDN 文档以获取有关兼容性和类似内容的更多信息。

于 2014-08-04T13:26:50.947 回答
0

不打开对话框的问题是http。Chrome 桌面通知仅适用于 https 协议。

我遇到了这个问题,我花了很多时间来解决这个问题。最后我得到了使用 https 的解决方案。

在这里我分享了代码,这样你就可以在 https 上运行,它会正常工作。

enter code here
       // 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");      
        };

      }

    }

    notifyMe();

    Call notifyMe(); to show notification
于 2019-04-11T11:34:12.497 回答