博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS推送通知拓展NotificationServiceExtension实践
阅读量:6831 次
发布时间:2019-06-26

本文共 2579 字,大约阅读时间需要 8 分钟。

前言

自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文件拷贝到工程中:

转载于:https://juejin.im/post/5caef026f265da039e1fde7a

你可能感兴趣的文章
meta 详解,html5 meta 标签日常设置(转)
查看>>
简单的三元运算符 购物车商品数量文本框
查看>>
linux软件操作
查看>>
Fedora27安装宝塔linux面板出现/usr/lib/rpm/redhat/redhat-hardened-cc1找不到的错误
查看>>
Qt如何设置应用ico图标
查看>>
openwrt-智能路由器hack技术(1)---"DNS劫持"
查看>>
单例模式
查看>>
根据webform页面大小的变化动态调整控件的大小
查看>>
673:Parentheses Balance
查看>>
RabbitMQ学习总结(5)——发布和订阅实例详解
查看>>
C#基础加强二:const和readonly深入研究
查看>>
类序列化
查看>>
ASP.NET 日志组件Smart.LogNet.DLL 引用即可写入日志及读取日志
查看>>
VS2013 密钥 – 所有版本(Visual Studio Ultimate,Premium,Professional,TFS)
查看>>
JavaScript中对象的比较
查看>>
网络爬虫基本练习
查看>>
课堂作业(String字符串类)
查看>>
verilog语法之memory存储器
查看>>
java 汉字转拼音
查看>>
dom中onload和弹出框以及location,history
查看>>