让我们来讲讲 UserNotifications 框架

以下是新框架带来的好处:

  1. 允许搭载多媒体文件
  2. 代理方法更简单,通知管理更方便
  3. Notification Service App 可以处理远端推送来的信息
  4. 处理本地通知和远程通知的位置相同

Payload

有效载荷
模板:

 {
   "aps":{
     "alert":{
       "title":"I am title",
       "subtitle":"I am subtitle",
       "body":"I am body"
     },
     "sound":"default",
     "badge":1
   }
 }

请求权限

注意,请在合适的时候请求权限,获取完权限之后可以推送本地通知了,如果需要使用远程通知还需要注册
registerForRemoteNotifications

UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound])

获取通知设置 UNNotificationSettings

回调中会包含 settings 的设置,以下是 settings 的属性

  • authorizationStatus 授权状态
  • notificationCenterSetting 是否在通知中心显示
  • soundSetting 是否开启声音
  • alertSetting 通知的样式的设置
  • alertStyle 通知的样式
  • lockScreenSetting 是否在锁屏情况下显示
  • carPlaySetting

创建通知内容 UNMutableNotificationContent

可以创建标题、副标题、正文、附件

let content = UNMutableNotificationContent()
content.title = "New cuddlePix!"

创建通知触发器 UNTimeIntervalNotificationTrigger

通知触发条件设定

  • UNPushNotificationTrigger(系统创建的方法)
  • UNTimeIntervalNotificationTrigger 时间触发器
  • UNCalendarNotificationTrigger 日期触发器
  • UNLocationNotificationTrigger 位置触发器

创建请求 UNNotificationRequest

每个请求需要一个单独的 id

let request = UNNotificationRequest(identifier: uuid, content: content, trigger: trigger)

通知附件 UNNotificationAttachment

支持音频 < 5M、视频 < 50M、图片 < 10M
对于本地通知直接在通知内容中设置附件属性即可
对于远程通知,需要实现 UNNotificationServiceExtension,在回调request.content.attachments 属性中设置
options 可以添加UNNotificationAttachmentOptionsTypeHintKey来表示当前使用的文件类型。

 let attachment = try! UNNotificationAttachment(identifier:uuid, url: imageLocalURL, options: .none)
 content.attachments = [attachment]

前台通知

实现对应的代理方法即可, delegate 必须在 applicationDidFinishLaunching: 返回前就完成设置
前提条件:
注册代理UNUserNotificationCenter.current().delegate = self

userNotificationCenter(_ center: UNUserNotificationCenter,
      willPresent notification: UNNotification,
      withCompletionHandler completionHandler:
      @escaping (UNNotificationPresentationOptions) -> Void){
        completionHandler(.alert)
  }

通知交互

实现对应的代理方法即可
前提条件也是注册代理
UNNotificationResponse是一个几乎包括了通知的所有信息的对象

userNotificationCenter(_:didReceive:withCompletionHandler:)

修改通知

更新通知

对于通知的更新来说,直接使用创建通知的方法即可,不同的是需要确保identifier 和之前的保持一致。
对于删除通知来说 removePendingNotificationRequestsremoveDeliveredNotifications,实际上也是需要 identifier

分类 Category

注册分类,也需要在 didFinishLaunch 结束之前完成
UNUserNotificationCenter.current().setNotificationCategories([yourDefinedCategory]),category 定义了不同的类型的通知对应的响应事件的方式。
在 Content 中设置对应的分类,比如content.categoryIdentifier = "yourDefinedCategory",那么在展示的时候就可以看到对应的动作。而在didReceive response方法里通过判断分类的类型来处理对应的逻辑。

UNNotificationAction 响应事件
  • UNNotificationAction 按钮
  • UNTextInputNotificationAction 输入框

其他

本地化

String.localizedUserNotificationString(forKey: "your_key", arguments: [])的方式来从 Localizable.strings 文件中取出本地化字符串;而远程推送的话,也可以在 payload 的 alert 中使用 loc-key 或者 title-loc-key 来进行指定。关于 payload 中的 key。

Service Extension

收到远程推送的通知后,展示之前对通知内容进行修改,只对远程推送的通知起效,本机截取推送并替换内容的方式,可以完成端到端 (end-to-end) 的推送加密。你在服务器推送 payload 中加入加密过的文本,在客户端接到通知后使用预先定义或者获取过的密钥进行解密,然后立即显示。这样一来,即使推送信道被第三方截取,其中所传递的内容也还是安全的。
通过远程推送的方式,你也可以显示图片等多媒体内容。这要借助于上一节所提到的通过 Notification Service Extension 来修改推送通知内容的技术。一般做法是,我们在推送的 payload 中指定需要加载的图片资源地址,这个地址可以是应用 bundle 内已经存在的资源,也可以是网络的资源。不过因为在创建 UNNotificationAttachment 时我们只能使用本地资源,所以如果多媒体还不在本地的话,我们需要先将其下载到本地。在完成 UNNotificationAttachment 创建后,我们就可以和本地通知一样,将它设置给 attachments 属性,然后调用 contentHandler 了。

//可以在这里修改通知内容
didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void){}

//进程即将被结束的标志,被调用之前,你有一定的时间来处理和更改通知内容(比如下载资源),如果来不及处理(下载),那么下面这个方法会被触发。
serviceExtensionTimeWillExpire

payload 示例:
mutable-content 表示是否通过 Service Extension 来修改通知内容。
你可以添加自定义的 key-value 值。

{
  "aps":{
    "alert":{
      "title":"Image Notification",
      "body":"Show me an image from web!"
    },
    "mutable-content":1,  
    "category":"yourcategory"
  },
  "image": "https://onevcat.com/assets/images/background-cover.jpg"
}

Content Extension

自定义通知视图的样式

Comments
Write a Comment