其他分享
首页 > 其他分享> > PWA(Progressive Web App)入门系列:Notification

PWA(Progressive Web App)入门系列:Notification

作者:互联网

前言

在很多场景下,需要一种通知的交互方式来提醒用户,传统方式下可以在页面实现一个 Dialog,或通过修改网页的 title 来实现消息的通知。然而传统的实现存在着一定的不足,在网页最小化的情况下,无法查看任何通知,导致用户无法及时获取通知信息。

给力的 W3C 推出了 Notifications API,专注于 WEB 的通知。


Notifications

Notifications API 的 Notification 界面用于配置和显示用户的桌面通知。 这些通知的外观和特定功能因平台而异,但通常它们提供了一种向用户异步提供信息的方法。

此 API 在 WebWorker 环境下也可以使用。
注意:此 API 必须运行在 https 环境下,非 https 环境无法授权。

流程:

构造器

语法:

var myNotification = new Notification(title, options);

参数:

属性

静态属性:

实例属性:(含义同构造器中的 option)

事件

onclick

点击显示通知框时触发的事件。

Notification.onclick = function(event) { ... };

可以通过 preventDefault() 阻止焦点显示到 notification 打开的 tab 上。
通过 event.currentTarget 来获取属性。

onclose

通知关闭时,触发此事件。
必须调用 Notification.close() 才能触发此事件。

Notification.onclose = function() { ... };

onerror

用作错误事件的事件处理程序。发生错误时,将调用指定的函数。如果为null,则没有错误处理程序生效。

Notification.onerror = EventListener;

onshow

通知出现的时候,触发此事件。

Notification.onshow = function() { ... };

方法

静态方法:

当前 permission 为 default 时,出现授权通知:

注意:在 PC 中,当出现授权通知时,如果不做任何选择,而是点击右上角的关闭x,连续三次这种操作后,系统会自动设置为 denied。

当前 permission 为 granted 时,直接返回 Promise,执行 then 后的代码。后续不需要在申请权限。

当前 permission 为 denied 时,直接返回 Promise,执行 catch 后面的代码。后续一直是拒绝状态,不再弹出授权框。此时 serviceWorker pushManager 不可用,订阅会抛出错误。此状态下,只能通过用户自己去修改权限。

实例方法:


实例

点击通知 打开指定页面

Notification.requestPermission().then(() => {
  var n = new Notification('天气预报', {
    body: '今天天气晴朗,详情请点击~',
    icon: 'https://img.alicdn.com/tfs/TB1XPvwUVzqK1RjSZFvXXcB7VXa-1024-1024.png',
    requireInteraction: true,
    data: {
      nav: 'https://baidu.com'
    }
  });
  
  n.onclick = event => {
    n.close();
    
    if(event.currentTarget.data.nav) {
      window.open(event.currentTarget.data.nav);
    }
  };
}).catch(() => {
  alert('通知权限已禁止,请设置打开权限');
})

通知按钮交互

actions 必须在 serviceWorker 中使用。

navigator.serviceWorker.ready.then(swReg => {
  Notification.requestPermission().then(() => {
    swReg.showNotification('好友请求', {
      body: '美女向你打招呼~',
      icon: 'https://img.alicdn.com/tfs/TB1qyPtU3HqK1RjSZFEXXcGMXXa-640-859.png',
      requireInteraction: true,
      actions: [{
        action: 'yes',
        title: '加好友',
      }, {
        action: 'no',
        title: '拒绝'
      }]
    });
  })
})

sw 环境处理代码:

self.addEventListener("notificationclick", function(event) {
  console.log("notificationclick", event);
  event.notification.close();
  
  if(event.action == 'yes') {
    // ***
  } else if(event.action == 'no') {
    // xxx
  }
});

兼容性


博客名称:王乐平博客

CSDN博客地址:http://blog.csdn.net/lecepin

知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

标签:Web,Progressive,通知,用户,Notification,action,data,event
来源: https://blog.csdn.net/lecepin/article/details/89854436