iOS移动端用户统计开发文档
时间:2022-06-01
本文章向大家介绍iOS移动端用户统计开发文档,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
开发者根据业务需求在相关的模块进行设置id,SDK通过运行时进行数据收集
Runtime
页面统计
关键代码
-(void)setPageEvent:(id)pageEvent;
使用方法
- (void)viewDidLoad {
[super viewDidLoad];
[self setPageEvent:@{@"id":@"window_10101_8383"}];
}
按钮统计
关键代码
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents event:(id)event;
使用方法,event参数与后端定义的统一@{@"id":@"message_111_222"},
UIButton *rightBtn = [UIButton buttonWithType:UIButtonTypeCustom];
rightBtn.bounds = CGRectMake(0, 0, 33, 33);
[rightBtn setImageEdgeInsets:UIEdgeInsetsMake(7, 14, 7, 0)];
[rightBtn addTarget:self action:@selector(rightBarButtonClick:) forControlEvents:UIControlEventTouchUpInside event:@{@"id":@"message"}];
[rightBtn setImage:[UIImage imageNamed:@"window_message"] forState:UIControlStateNormal];
UIBarButtonItem *rightBtnItem = [[UIBarButtonItem alloc] initWithCustomView:rightBtn];
AOP
页面统计
关键代码
+ (void)trackViewAppear{
NSString *path = [[NSBundle mainBundle] pathForResource:@"ICPageList" ofType:@"plist"];
NSDictionary *pageStatisticsDict = [[NSDictionary alloc] initWithContentsOfFile:path];
[UIViewController aspect_hookSelector:@selector(viewWillAppear:)
withOptions:AspectPositionBefore
usingBlock:^(id<AspectInfo> info){
//用户统计代码写在此处
NSString *className = NSStringFromClass([info.instance class]);
ICLog(@"className-->%@",className);
NSString *ID = pageStatisticsDict[className] == nil ? className : pageStatisticsDict[className];
// 通过className从ICPageList匹配到对应的id上传到服务器
[ICClickRecord beginLogPageView:@{@"ID":ID}];
}
error:NULL];
[UIViewController aspect_hookSelector:@selector(viewWillDisappear:)
withOptions:AspectPositionBefore
usingBlock:^(id<AspectInfo> info){
//用户统计代码写在此处
NSString *className = NSStringFromClass([info.instance class]);
NSLog(@"className-->%@",className);
NSString *ID = pageStatisticsDict[className] == nil ? className : pageStatisticsDict[className];
// 通过className从ICPageList匹配到对应的id上传到服务器
[ICClickRecord endLogPageView:@{@"ID":ID}];
}
error:NULL];
}
使用方法
在ICPageList.plist文件中配置需要统计的页面类名以及页面ID
方法统计
关键代码
+ (void)trackBttonEvent{
__weak typeof(self) ws = self;
//设置事件统计
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//读取配置文件,获取需要统计的事件列表
NSString *path = [[NSBundle mainBundle] pathForResource:@"ICEventList" ofType:@"plist"];
NSDictionary *eventStatisticsDict = [[NSDictionary alloc] initWithContentsOfFile:path];
for (NSString *classNameString in eventStatisticsDict.allKeys) {
//使用运行时创建类对象
const char * className = [classNameString UTF8String];
//从一个字串返回一个类
Class newClass = objc_getClass(className);
NSArray *pageEventList = [eventStatisticsDict objectForKey:classNameString];
for (NSDictionary *eventDict in pageEventList) {
//获取事件方法名称
NSString *eventMethodName = eventDict[@"MethodName"];
SEL seletor = NSSelectorFromString(eventMethodName);
NSString *eventId = eventDict[@"EventId"];
[ws trackEventWithClass:newClass selector:seletor eventID:eventId];
[ws trackParameterEventWithClass:newClass selector:seletor eventID:eventId];
[ws trackTableViewEventWithClass:newClass selector:seletor eventID:eventId];
}
}
});
}
使用方法
在ICEventList.plist文件中配置需要统计的方法名称以及方法ID
项目中部分特殊业务逻辑可单独调用ICClickRecord中的event方法进行事件统计
统计数据存储模块
事件触发-->存储
ICClickRecord
+ (void)event:(id)info {
ICLog(@"发送到服务器%@", info);
ICUserBehaviorInfo *event = [ICUserBehaviorInfo mj_objectWithKeyValues:info];
event.time = [NSDate longFromDate:[NSDate date]];
[event saveToDB];
// 友盟统计
[MobClick event:event.ID];
}
统计数据上报模块
启动同步
每次启动时发送缓存的数据
- (void)uploadUserBehaviorRecod:(NSDictionary *)recodDic
success:(HttpSuccessCompletionHandle)success
failure:(HttpFailureCompletionHandle)failure {
NSString *url = [self appendRequestBaseURL:@""];
[ICNetworkHelper POST:url parameters:recodDic success:^(id responseObject) {
success(responseObject);
} failure:^(NSError *error) {
if (failure) {
failure(error);
}
}];
}
定时同步
应用在线时定时向服务端发送数据
/** 当reportPolicy == SEND_INTERVAL 时设定log发送间隔
@param second 单位为秒,最小90秒,最大86400秒(24hour).
@return void.
*/
+ (void)setLogSendInterval:(double)second;
配置解析模块(下个版本)
应用启动时(动态配置获取业务数据的类型,配置上报的规则和地址等)
- 数据城堡参赛代码实战篇(六)---使用sklearn进行数据标准化及参数寻优
- 震惊!Vector两行代码求逆序对,六行代码过普通平衡树
- 数据城堡参赛代码实战篇(五)---使用sklearn解决分类问题
- 洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall
- [编程经验]Python生成器、迭代器与yield语句小结
- TensorFlow从0到1 - 12 - TensorFlow构建3层NN玩转MNIST
- 数据城堡参赛代码实战篇(四)---使用pandas合并数据表
- HDU 2586 How far away ?
- HDU 3078 Network
- 数据城堡参赛代码实战篇(三)---我们来探究一个深奥的问题!
- 数据城堡参赛代码实战篇(二)---使用pandas进行数据去重
- 洛谷P3375 【模板】KMP字符串匹配
- Day5下午解题报告1
- [编程经验] Python中处理时间的方法小结
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释