iOS使用Notification Service Extension统计iOS 10后的Push到达率
只能统计iOS 10之后版本,iOS 10之前无效
Notification Service Extension此扩展为苹果官方在iOS 10推出的扩展类,可以在展示Push横幅前截取Push,对Push进行对其展示、文案、等其他的东西进行修改。但是此扩展也可以进行对Push到达率进行统计,因为之前只能统计点击率。
本文中有任何问题,本人均会一一回复,该文档会持续更新,现在我们公司的项目已正常上线,无任何问题
前提
为什么不使用下方API,因为该方法部分场景下是无法捕获push的,并附上官方文档
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0);
官方文档
Use this method to process incoming remote notifications for your app. Unlike the application:didReceiveRemoteNotification: method, which is called only when your app is running in the foreground, the system calls this method when your app is running in the foreground or background. In addition, if you enabled the remote notifications background mode, the system launches your app (or wakes it from the suspended state) and puts it in the background state when a remote notification arrives. However, the system does not automatically launch your app if the user has force-quit it. In that situation, the user must relaunch your app or restart the device before the system attempts to launch your app automatically again.
本人开发环境
- macOS Mojave 10.14.4
- Xcode 10.2.1
- iPhone X 12.3
- SmartPush 2.0(1)
如果使用SmartPush 进行推送测试
可以使用以下json
{
"aps":{
"alert":"This is some fancy message.",
"badge":6,
"mutable-content":1,
"sound":"default"
}
}
举一反三
1、可以实现push到达率统计功能
2、可以实现不启动APP,下载小文件功能
3、可以进行push信息脱敏处理功能
4、可以更改提示音功能
5、and so on。。。。。。。。
官方文档
https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension
Notification Service Extension概述
如下图所示 APNs 是将消息首先推送给 ServiceExtension ,ServiceExtension 会处理好数据后再展示给用户一个优美的界面,ServiceExtension 就是一个厨师,收到原材料,给用户做成美味的食物一样,so sweat!
在展示用户推送内容前,UNNotificationServiceExtension 是修改远程推送携带的内容。UNNotificationServiceExtension 类 可以让开发者自定义推送展示的内容,Notification Service app extension 不会自己提供推送界面的,当将适当类型的推送传递给用户的设备时,它会按需启动。你可以用 extension 修改推送内容和下载推送相关的资源。你可以在extension 中解密和加密的数据或下载推送相关的图片。
你不需要自己创建 UNNotificationServiceExtension 实例,Xcode 已经帮我们创建好了。当满足如下两个条件,应用收到远程推送时,应用会加载 extension 和调用 didReceiveNotificationRequest:withContentHandler: 方法。
在 didReceiveNotificationRequest:withContentHandler: 里面可以处理远程推送内容,修改远程推送内容的时间是有限的(不超过30S)。如果修改内容任务没有完成,系统会调用 serviceExtensionTimeWillExpire 方法,给你提供最后一次提供修改内容的机会。如果你没有修改远程推送成功,系统将会展示远程推送最原始的内容。
创建扩展Target
1、在原有项目上new一个target,如下图所示
2、创建Notification Service Extension,如下图所示
3、自定义名称,其他的不需要更改,系统会自动配置
截获push前提
1、需要新增一个字段mutable-content": "1",在aps内部,即与alert同级,如下图所示
-
远程推送的 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均需要配置 - http请求
-
不进行配置时会报如下图错误
- 右键点击info.plist,Open As -> Source Code 将下面的代码填入最后的
</dict> </plist>
前即可
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
调试
1、先run主target,如下图所示
2、再run Notification Service Extension,如下图所示
3、最后,手动选择你的主target,或者search,如下图所示
这样在收到push时,就可以进行打印Log或者断点进行调试了
关于文件共享
选定指定.m文件后,在target memberShip中勾选要共享至的target,然后在指定target的指定文件引用头文件可以正常使用
统计Push到达率
1)操作方法
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler
2)极光推送统计
极光有一个小的子SDK,可用于采集push到达率,建议使用这种方式
3)server端推送统计
- 可以让server端在push中加一个类似pushId的字段
- 在NotificationService中的didReceiveNotificationRequest方法中获取self.bestAttemptContent.userInfo
- 使用NSURLSessionTask(建议使用官方网络)进行将规定的pushId进行post请求发给server端进行统计push到达率
3)其他策略
- 也可以使用下面提到的数据共享,先将该Extension中的push携带数据暂存,然后在宿主APP启动时获取,又可以做很多东西~
数据获取(数据共享)
- 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。(使用上文提到的xcode版本,可以一直走断点,前后操作了数十次,均没有问题
2019年5月29日)推翻网络上的部分文章 - 实测集成了Notification Service Extension可安装app - 2018/3/6 下午12:01:01
如果接入了Notification Service Extension时收不到push,需要确认以下几点
1、确认子target最低支持版本是否为iOS10,且该机器系统版本高于iOS10
2、子target的APP ID,PP文件中的bundle ID是否与xcode中一致
3、运行的是否为子target
如果都正确,则重启电脑和手机,妥妥的可以接收到push(本人亲测,因为该问题解决了5个小时,结果重启就可以了。。。)
https://www.jianshu.com/p/e458879f188d?appinstall=0
https://zhidao.baidu.com/question/1801940902903964387.html
两文章提到iOS 10以下无法安装集成Notification Service Extension的app,本人亲测,可安装