前言
自iOS10 更新以来,Apple 表示这是 iOS 有史以来最大的升级(our biggest release yet),更加智能开放的Siri、强化应用对3DTouch支持、 HomeKit 、电话拦截及全新设计的通知等等。
iOS 10 中将之前繁杂的推送通知统一成UserNotifications.framework 来集中管理和使用通知功能,还增加一些实用的功能——撤回单条通知、更新已展示通知、中途修改通知内容、在通知中显示多媒体资源、自定义UI等功能。
iOS10推送通知的有以下两个两个扩展框架:
- UNNotificationServiceExtension(通知服务拓展)
- UNNotificationContentExtension(通知内容拓展)
通知拓展 | 特性 |
---|---|
UNNotificationServiceExtension | 在收到通知后,展示通知前,做一些事情的。比如,增加附件,网络请求等。 |
UNNotificationContentExtension | 可以通过提前配置的categoryIdentifier来定制推送显示的界面 |
一、UNNotificationServiceExtension - 通知服务扩展
1.什么是UNNotificationServiceExtension?
的主要功能,是让我们在收到远程推送的时候,在推送展示之前对其进行修改,因为我们收到远程推送之前会先去执行Service Extension中的代码,这样就可以在收到远程推送展示之前做一些操作。
2.UNNotificationServiceExtension的作用
通知服务拓展能做什么?举个例子:
1.更改推送内容
通过远程推送,推送的内容的title="1",我可以在收到推送将要显示之前将标题修改成title="2",那么推送条展示的title就是2。
2.对推送内容加解密
在发送推送的时候发送一段用公钥加密的内容,然后设备收到推送之后,用私钥进行解密然后再去展示。例如开发者不想让第三方推送sdk(极光推送等)知晓推送内容,则可以采用通知服务拓展。
3.推送事件响应
在推送发送时,可以使用服务拓展对通知的状态(例如到达率)做统计。
4.富媒体下载
当远程推送需要展示多媒体的时候,也需要在这下载,下载完毕之后,获取本地下载文件路径再进行展示。对下载附件多媒体得需要Service Extension。
3.UNNotificationServiceExtension实践
3.1 创建一个Service Extension
File -> New -> Target
选择拓展 随后点击创建拓展即可,发现此时在项目中出现“xxxServiceExtension”的文件夹。 文件夹中包含了推送拓展类NotificationService。3.2 测试
第一步,选择target为extension,运行项目:
第二步,选择当前项目第三步,在NotificationService.m中的didReceiveNotificationRequest中添加断点:
第四步,发个远程推送,注意,本地推送是没反应的。注意
新加 NotificationServiceExtension的项目,对应的的Extension target的Build Phases-》link binary with libraries 加上
- libresolv.tbd
- libz.tbd
3.2 远程推送相关注意事项
相对于普通推送,推送服务拓展payload的内容基本相同,举个例子:
{ "aps":{ "alert":{ "title":"iOS 10 title", "subtitle":"iOS 10 subtitle", "body":"iOS 10 body" }, "mutable-content":1, "category":"saySomethingCategory", "sound":"default", "badge":3 }}复制代码
注意,推送内容多了一个mutable-content,它表示我们会在接收到通知时对内容进行更改。
开发者在didReceiveNotificationRequest方法中有30秒的时间对推送内容到达前进行处理。例如:- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler { self.contentHandler = contentHandler; self.bestAttemptContent = [request.content mutableCopy]; // Modify the notification content here... self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title]; self.bestAttemptContent.body = @"我是新修改的body"; self.bestAttemptContent.title = @"我是新修改的title"; self.bestAttemptContent.subtitle = @"我是新修改的subtitle"; self.contentHandler(self.bestAttemptContent);}复制代码
3.3 推送测试工具
这里推荐Knuff:
极光接入
若开发者使用极光推送,则下载极光的SDK ,把里面的lib文件拷贝到工程中: