UserNotifications

iOS10新增加了一个UserNotificationKit(用户通知框架)来整合通知相关的API,下面简单介绍一下新特性。
1.丰富了推送内容:现在可以设置推送的title、subtitle、body 以及符合大小的图片、音频、视频等附件内容。
2.可以操作管理通知:可以对通知进行查看、更新、删除。
3.优雅的展示方式:可以设置应用在前台展示通知。
对iOS10而言,UserNotificationKit(用户通知框架)是一种系统层面的UI展示,远程通知APNS只是通知的一种触发方式,UserNotificationKit的重要意义在于统一了Remote(远程通知)和Local(本地通知)。

本地通知

UserNotificationKit的基本使用流程
1.注册通知: 获取相关权限,注册APNS
2.发送通知: 创建通知并发起通知请求
3.处理通知: 处理通知回调,查找,移除,更新等


category.jpeg
1. 注册通知

UNUserNotificationCenter 用以管理与通知相关的行为。如果想要使用通知的话,必须先获取用户的授权,才可使用 requestAuthorization 方法。

// 请求通知权限
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) {
    (accepted, error) in
    if !accepted {
        print("用户不允许消息通知")
    }else {
        print("用户允许消息通知");
    }
}
2.发送通知

发送通知主要包括通知的内容:
1.设置推送内容

// 设置推送内容
let content = UNMutableNotificationContent()
content.title = "测试标题"
content.subtitle = "测试副标题"
content.body = "测试内容"
content.badge = 2
content.categoryIdentifier = "categoryIdentifier" //category标识,操作策略
content.sound = UNNotificationSound.default

// Media Attachments 发送附件:图片,音频,视频
通过本地磁盘上的文件 URL 创建一个 UNNotificationAttachment 对象,然后将这个对象放到数组中赋值给 content 的 attachments 属性:
let imageName = "icon_goods"
guard let imageURL = Bundle.main.url(forResource: imageName, withExtension: "png") else { return }
let attachment = try! UNNotificationAttachment(identifier: imageName, url: imageURL, options: .none)
content.attachments = [attachment]

2.设置通知触发器(4种触发器)
UNPushNotificationTrigger 触发APNS服务,系统自动设置(这是区分本地通知和远程通知的标识)
UNTimeIntervalNotificationTrigger 一段时间后触发
UNCalendarNotificationTrigger 指定日期触发
UNLocationNotificationTrigger 根据位置触发,支持进入某地或者离开某地或者都有。

// UNTimeIntervalNotificationTrigger 延时触发
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)

// UNCalendarNotificationTrigger  定时执行
let dateComponents = NSDateComponents()
let hour = "21"
let minute = "23"
dateComponents.hour = Int(hour)!
dateComponents.minute = Int(minute)!
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents as DateComponents, repeats: false)

3.添加通知

//设置请求标识符
let requestIdentifier = "categoryIdentifier"
//设置一个通知请求
let request = UNNotificationRequest(identifier: requestIdentifier,
                                content: content, trigger: trigger)
//将请求添加到发送中心
UNUserNotificationCenter.current().add(request) { error in
    if error == nil {
        print("添加推送成功!")
    }
}

4.通知策略(category+action)
action:设置标识(identifier)、按钮标题(title)、按钮选项(options)
options:
UNNotificationActionOptionAuthenticationRequired  执行前需要解锁确认
UNNotificationActionOptionDestructive  显示高亮(红色)
UNNotificationActionOptionForeground  将会引起程序启动到前台
action 有2种类型:
UNNotificationAction 普通按钮样式
UNTextInputNotificationAction 输入框样式

//把category添加到通知中心
center.setNotificationCategories([newsCategory])
//创建category
let newsCategory: UNNotificationCategory = {
    let intoAppAction = UNNotificationAction(
        identifier:  "id",
        title: "进入应用",
        options: [.foreground])
    
    let ignoreAction = UNNotificationAction(
        identifier:  "destructive",
        title: "忽略",
        options: [.destructive])
    
    return UNNotificationCategory(identifier:"categoryIdentifier",
                                  actions: [intoAppAction,ignoreAction],
                                  intentIdentifiers: [], options: [.customDismissAction])
}()

3.处理通知

常规处理
在创建通知请求时,我们已经指定了标识符。iOS10中我们可以通过标识符来管理处理通知。UserNotificationKIt提供了一系列API ,通过request的identifier,进行通知的查找、更新、删除。这个标识是用来区分这个通知和其他通知的。

1.查找通知
// 获取所有等待递送的通知
UNUserNotificationCenter.current().getPendingNotificationRequests { (request) in
 }
// 获取所有已经递送的通知
UNUserNotificationCenter.current().getDeliveredNotifications { (noti) in
}
2.更新通知
远程推送可以进行通知的更新
更新:center 的 addNotificationRequest:withCompletionHandler: 方法在 id 不变的情况下重新添加,就可以刷新原有的推送。
3.删除通知/取消通知
//删除已经递送的通知
 UNUserNotificationCenter.current().removeAllDeliveredNotifications() 
//删除所有等待递送的通知
 UNUserNotificationCenter.current().removeAllPendingNotificationRequests() 
//删除特定已经递送的通知(identifier)
UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: ['Identifier'])
//删除特定等待递送的通知(identifier)
UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: ["Identifier"])
通知的回调处理UNUserNotificationCenterDelegate
UNUserNotificationCenter遵循UNUserNotificationCenterDelegate代理
//在应用内展示通知
func userNotificationCenter(_ center: UNUserNotificationCenter,
                       willPresent notification: UNNotification,
                       withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
{
    completionHandler([.alert, .sound,.badge])

    // 如果不想显示某个通知,可以直接用空 options 调用 completionHandler:
    // completionHandler([])
}
//对通知进行响应,收到通知响应时的处理工作,用户与你推送的通知进行交互时被调用;
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    completionHandler()
}

当打开应用时移除小红点
func applicationWillEnterForeground(_ application: UIApplication) {
    // 可以在此处移除通知
    NoticeManeger().removeNotice()
    application.applicationIconBadgeNumber = 0
}
Notification Extension

iOS 10 中添加了很多 extension,作为应用与系统整合的入口。与通知相关的 extension 有两个:Service Extension 和 Content Extension。前者可以让我们有机会在「接收到推送之后、展示推送之前」对通知内容进行修改;后者可以用来自定义通知视图的样式。

Service Extension(只对远程推送APNS的通知起效, 这里不做详细介绍)
Service Extension:可以对推送进行处理,更改、替换原有的内容。他可以对通知内容进行加密,也可以给推送展示内容添加附件(比如照片、背景音乐),使得内容更加丰富。
Content Extension:可以用来自定义通知的详细页面视图
1.创建NotificationContent,会生成NotificationViewController类,storyboard和info.plist
2.必须实现didReceive方法,
3.MainInterface.storyboard可以对UI进行修改,
4.Info.plist。可以通过 Info.plist 控制通知详细视图的尺寸,以及是否显示原始的通知;UNNotificationExtensionCategory要对应center注册时的Identifier;


ContentExtension.jpeg

iOS12新特性

Grouped notifications 推送分组
Notification content extensions 推送内容扩展中的可交互和动态更改Action
Notification management 推送消息的管理
Provisional authorization 临时授权
Critical alerts 警告性质的推送
########1.推送分组
自动:苹果会优先根据threadIdentifier进行分组,否则则会根据应用分组;
按App:设置按App,则自定义会失效,会根据应用分组;
关闭:使用无分组样式;

content.threadIdentifier = UUID().uuidString
2. 摘要Summary

当苹果把消息归拢到一起时,比如会显示:有xxx条消息来自xxx。具体文案根据自己设置。
也可以通过 let summaryFormat = NSString.localizedUserNotificationString(forKey: "NOTIFICATION_SUMMARY", arguments: nil) 来进行本地化服务

let likeAction = UNNotificationAction(
    identifier: "likeAction",
    title: "Like",
    options: [.authenticationRequired])
let reactAction = UNNotificationAction(
    identifier: "reactAction",
    title: "React",
    options: [.authenticationRequired])
if #available(iOS 12.0, *) {
    return UNNotificationCategory(identifier:"categoryIdentifier",
                                  actions: [likeAction,reactAction],
                                  intentIdentifiers: [],
                                  hiddenPreviewsBodyPlaceholder:"新的消息",
                                  categorySummaryFormat:"还有%u条来自%@的消息",
                                  options: [.customDismissAction])
}
IMG_F8992CDF880D-1.jpeg
3.推送内容扩展中的可交互和动态更改Action

比如设置喜欢action,点赞action,用户点击action时,可以在UI进行变化;

在Content Extension类中实现下面的方法
func didReceive(_ notification: UNNotification) {
}
func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) {
}
具体功能实现根据功能需求。
IMG_9928.PNG

IMG_9929.PNG
4.隐式推送

隐式推送目的是为了保护用户隐私。当用户设置了隐式推送,只能在通知中心中查看消息,锁定屏幕时,没有横屏展示,也没有标记和声音。
具体设置:1.可以在设置-通知,只打开消息中心;
2.可以在有消息推送过来时,左滑有个管理按钮,设置隐式推送或者显式推送;
值得注意的是,当我们请求通知权限时,有个provisional属性,如果设置了该属性,则用户在通知中心中会收到消息,但是会有一个用户选择的权限,用户可以选择继续接收,或者关闭。点击继续接收时,也可以设置隐式推送,或者显式推送。

//请求通知权限
center.requestAuthorization(options: [.alert, .sound, .badge,.provisional]) {
    (accepted, error) in
    if !accepted {
        print("用户不允许消息通知")
    }
}

IMG_9925.PNG
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容