【问题标题】:Check if browser notifications are temporary disabled in firefox检查浏览器通知是否在 Firefox 中被临时禁用
【发布时间】:2018-09-04 13:26:15
【问题描述】:

可以通过Notification.permission属性检查浏览器通知的权限。

在 Firefox 中,用户可以暂时禁用浏览器通知。这意味着当打开新标签页或窗口时,浏览器将请求再次显示通知的权限。

当用户暂时拒绝权限并且我检查Notification.permission 属性时,它返回default

当我运行以下脚本时,我在控制台中得到 browser notifications where allowed 作为输出。

Notification.requestPermission().then((result) => {
    console.log(result);
});

但是当我尝试显示通知时,什么也没有发生(因为它们被暂时禁用)。


如何检查浏览器通知是否已在 Firefox 中被临时禁用?

我可以使用以下脚本,但它是一个丑陋的解决方法,它会触发浏览器请求许可的对话框。我可以做点别的吗?

var calculateBrowserNotificationPermission = () => {
    return new Promise(function(resolve, reject) {
        var permission = Notification.permission;
        if(permission !== 'default') {
            resolve(permission);
            return;
        }

        Notification.requestPermission().then((result) => {
            if(result === 'default') {
                resolve('temporary_denied');       
            } else {
                resolve(result);
            }
        });
    });
};

如果还没有这样的功能,最好的地方是哪里?

编辑 1:我在 WHATWG 的通知库中打开了 an issue

编辑 2:我已经关闭了 github 问题,如果我已经按照 @jib 的建议向用户请求权限,我将继续存在。

【问题讨论】:

  • 根据此页面:developer.mozilla.org/en-US/docs/Web/API/Notification/… 临时禁用应返回默认值,应作为拒绝处理。如果不是这种情况,那么我真的看不到其他选项来实现“if”循环的解决方法来检查它是否为默认值。
  • @mrdeadsven 感谢您的赞扬,但我觉得这句话有点令人困惑。为什么应该像denied 状态一样处理状态default。当我不详细了解他的状态时,我如何通知用户他的下一步应该是什么。这只需要丑陋的网站和冗长的解释,这样用户就可以使用此功能而无需成为超级用户。
  • 您阅读了我发送给您的网站上的内容吗?它清楚地指出:'默认:用户决定是未知的;在这种情况下,应用程序的行为就像许可被拒绝一样。当用户的决定未知时使用默认值。这要么是他们刚刚关闭通知,要么是他们暂时禁用它。您不应该问我为什么“Notification.permission”方法会这样工作,显然有人将其编码为这种方式是有原因的,但至于为什么,我无法为您提供答案,因为我没有使用这种方法。
  • 对不起,如果我以某种方式冒犯了您,但我的目标是检查通知是否被暂时禁用。为此,我会问任何必要的问题。如果几年后会添加一个新功能,这也很棒。我想改进它的工作方式,而不仅仅是解决问题。
  • 我没有被冒犯,我只是在问,因为您问了一个在文章中明确说明的问题。如果你想检查它是否被暂时禁用,我看不到其他方法,然后是这样的: if(Notification.permission === "default"){ //insert code that you want to execute here } 抱歉,我没有看到其他解决方案为此。

标签: javascript firefox browser notifications cross-browser


【解决方案1】:

但是当我尝试显示通知时没有任何反应

您使用的 API 有误。 requestPermission 不会拒绝拒绝,它会以结果解析:

(async () => {
  try {
    console.log(await Notification.requestPermission()); // denied
  } catch (e) {
    console.log(e); // never gets here
  }
})();

此处除granted 以外的任何结果都表示您未获得许可。试试看here

  • granted 表示您获得了执行通知的持久权限。
  • denied 表示用户选择永久屏蔽你。
  • default 表示用户选择不允许这个时间(在 Firefox 中启动临时阻止)。

如何检查浏览器通知是否已在 Firefox 中被临时禁用?

仅当您询问用户两次并且他们已经在同一会话中说“不”一次时,才会在 Firefox 中发生临时阻止。进行页面刷新 ↻ 的用户应该删除该块。 Firefox 目前正在保护用户免受网站的骚扰。

如果您尚未询问他们,default 表示将提示用户。弄清楚你是否已经拥有,希望很容易,如果你拥有,就不要再打扰他们了。

【讨论】:

  • 感谢您的回答。我已经更新了我的问题,所以它正确使用了 api。它不应该有任何区别。我会坚持说我已经按照建议询问了本次会议中的用户。
猜你喜欢
  • 2016-11-20
  • 2017-10-10
  • 2012-03-01
  • 2011-03-16
  • 2014-11-27
  • 1970-01-01
  • 2013-11-12
  • 2021-07-09
相关资源
最近更新 更多