只能统计iOS 10之后版本,iOS 10之前无效
Notification Service Extension此扩展为苹果官方在iOS 10推出的扩展类,可以在展示Push横幅前截取Push,对Push进行对其展示、文案、等其他的东西进行修改。但是此扩展也可以进行对Push到达率进行统计,因为之前只能统计点击率。
本人开发环境
- MacBook Pro 10.12.6
- Xcode 9.0
- iPhone 6s 11.2.5
Notification Service Extension概述
如下图所示 APNs 是将消息首先推送给 ServiceExtension ,ServiceExtension 会处理好数据后再展示给用户一个优美的界面,ServiceExtension 就是一个厨师,收到原材料,给用户做成美味的食物一样,so sweat!
2379949-77cd32e4ee3934d7.png在展示用户推送内容前,UNNotificationServiceExtension 是修改远程推送携带的内容。UNNotificationServiceExtension 类 可以让开发者自定义推送展示的内容,Notification Service app extension 不会自己提供推送界面的,当将适当类型的推送传递给用户的设备时,它会按需启动。你可以用 extension 修改推送内容和下载推送相关的资源。你可以在extension 中解密和加密的数据或下载推送相关的图片。
你不需要自己创建 UNNotificationServiceExtension 实例,Xcode 已经帮我们创建好了。当满足如下两个条件,应用收到远程推送时,应用会加载 extension 和调用 didReceiveNotificationRequest:withContentHandler: 方法。
在 didReceiveNotificationRequest:withContentHandler: 里面可以处理远程推送内容,修改远程推送内容的时间是有限的。如果修改内容任务没有完成,系统会调用 serviceExtensionTimeWillExpire 方法,给你提供最后一次提供修改内容的机会。如果你没有修改远程推送成功,系统将会展示远程推送最原始的内容。
创建扩展Target
1、在原有项目上new一个target,如下图所示
屏幕快照 2018-01-30 下午4.23.56.png2、创建Notification Service Extension,如下图所示
屏幕快照 2018-01-30 下午4.25.00.png3、自定义名称,其他的不需要更改,系统会自动配置
截获push前提
1、需要新增一个字段mutable-content": "1",与alert同级,如下图所示
lALPBbCc1WBFE6XNARPNAfI_498_275.png_620x10000q90g.jpg-
远程推送的 aps 字典中,mutable-content : 1
The remote notification’s aps dictionary includes the mutable-content key with the value set to 1.
2、alert不能为空
-
远程通知的配置是展示 Alert
The remote notification is configured to display an alert.
3、两个target的info.plist均需要配置
-
不进行配置时会报如下图错误
2379949-b128133f158736d1.png
- 右键点击info.plist,Open As -> Source Code 将下面的代码填入最后的
</dict> </plist>
前即可
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
调试
1、先run主target,如下图所示
屏幕快照 2018-01-30 下午4.50.49.png2、再run Notification Service Extension,如下图所示
屏幕快照 2018-01-30 下午4.50.59.png3、最后,手动选择你的主target,或者search,如下图所示
屏幕快照 2018-01-30 下午4.51.11.png这样在收到push时,就可以进行打印Log或者断点进行调试了
统计Push到达率
1、后台以及杀死app
1)操作方法
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler
2)极光推送统计
3)server端推送统计
- 可以让server端在push中加一个类似pushId的字段
- 在NotificationService中的didReceiveNotificationRequest方法中获取self.bestAttemptContent.userInfo
- 使用NSURLSessionTask(建议使用官方网络)进行将规定的pushId进行post请求发给server端进行统计push到达率
2、前台
- 集成了极光推送时,可在下方代码中进行网络请求完成统计
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler
- 未集成时,可在下方代码中进行网络请求完成统计
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
数据获取
- push携带信息
self.bestAttemptContent.userInfo
即上文截获push前提中的字典 - 宿主app信息 可使用app group来进行数据互通 具体请访问下文链接
http://blog.csdn.net/shengpeng3344/article/details/52190997
PS
-
可尝试以下的链接中的方式配合断点测试流程
https://github.com/liuyanhongwl/ios_common/blob/master/files/App-Extension-Tips.md
我做这块的时候不知道是电脑的问题还是什么问题,就是各种不走断点 -
如果使用NotificationServiceExtension 通过以下连接中的操作还是不走断点的话并且打印 Program ended with exit code: 0的话,断开真机与Xcode连接即可,则会走extension中的代码了,具体原因未知,望大神告知,初步认为Xcode的bug。
-
推翻网络上的部分文章 - 实测集成了Notification Service Extension可安装app - 2018/3/6 下午12:01:01
https://www.jianshu.com/p/e458879f188d?appinstall=0
https://zhidao.baidu.com/question/1801940902903964387.html
两文章提到iOS 10以下无法安装集成Notification Service Extension的app,本人亲测,可安装
网友评论