iOS统计Push推送到达率
众所周知,iOS 10 以后,苹果官方推出了Notification Service Extension
,查看文档,UNNotificationServiceExtension
的说明是,An object that modifies the content of a remote notification before it's delivered to the user.
,也就是在一个远程通知展示给用户之前,可以通过UNNotificationServiceExtension
来修改这个通知。
废话少说,直接开干吧。
一、如何监听收到推送
在原有的项目上新建一个 Target,如图,选择创建
在服务端推送的内容中新增一个字段
mutable-content": "1"
,与alert/badge/sound
处于同一层级。例如在推送平台中测试推送时,设置如下:先运行项目的主Target,然后再运行Notification Service Extension,手动选择主Target
发送测试推送,可以看到执行进入 Target 项目中的
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler
二、如何统计
- 如果是接入第三方推送平台,可以查看是否支持。如 极光的 Notification Service Extension 相关接口
- 如果自己实现的话,有以下两种方案
- 在通知扩展项目中写网络请求,将推送到达数据发送到后端服务器
- 将推送到达数据通过
App Group
保存到 App 的本地,在主 Target 中再处理
三、如何使用 App Groud 实现数据共享
在 https://developer.apple.com 登录,创建
App Group
在项目中配置,
target - Capabilites - App groups
代码中使用
NSUserDefaults 中使用
1
2
3
4
5
6NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.company.appGroupName"];
// write data
[userDefaults setValue:@"value" forKey:@"key"];
//read data
NSLog(@"%@", [userDefaults valueForKey:@"key"]);NSFileManager 中使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// write data
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.domain.groupName"];
NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"fileName"];
NSString *text = @"Go amonxu.com";
if (![[NSFileManager defaultManager] fileExistsAtPath:fileURL.path]) {
[text writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:nil];
} else {
NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingURL:fileURL error:nil];
[fileHandle seekToEndOfFile];
[fileHandle writeData:[text dataUsingEncoding:NSUTF8StringEncoding]];
[fileHandle closeFile];
}
// read data
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.domain.groupName"];
NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"fileName"];
NSString *fileContent = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];