统计这个事情可以说是个巨无语的系统,当然不把他独立出来也就不是什么问题了,只是一堆牛皮癣似得代码穿插在项目各个地方,毕竟真正应用到一个app里的统计都跟业务有着很强的绑定关系,脱离业务的统计数据基本没什么大用,先吐槽一波再开始正文。。。。
基础封装
先从用第三方的来说,基本上就只是需要包个壳就ok了,建个manager,初始化sdk一封装,加几个常用统计方法基本ok。常见的方法就是传个event名再加个properties传扩展字典,用户登录状态绑定注销,通用字段增删改,基本上这就满足了大部分需求。。。
如果是纯自己手写,上面说的壳放着,剩下的仿照sdk来,基本功能要实现异步队列记录往本地写数据,定期上传,处理好读写关系是关键,这里不多说不是这篇重点。
ps:有个壳才敢放开手折腾优化
切面封装
切面统计其实可以看我之前的IOS 百行代码切面日志,整个完成的就是切面的封装,看过的基本应该了解这套逻辑切面的时候不关心切面方法的参数的话会非常好用。
如果业务关联强的情况,虽然也能处理但要针对那些业务作出对应的逻辑,导致切面封装里夹杂很多特殊逻辑,下面的方法内部要对originAOP拆分取所有参,甚至要复制部分业务层逻辑过来最后完成一个统计。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22@interface NSObject (AOPLogger)
/**
替换或添加类方法,即使替换过也会替换,注意想单次替换使用dispatch_once保证,如果方法从未声明过则会添加失败
@param originalSelector 原方法
@param swizzledSelector 替换方法
@param error 错误信息
*/
+(void)al_hookOrAddWithOriginClassSeletor:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector error:(NSError**)error;
/**
替换或添加实例方法,即使替换过也会替换,注意想单次替换使用dispatch_once保证,如果方法从未声明过则会添加失败
@param originalSelector 原方法
@param swizzledSelector 替换方法
@param error 错误信息
*/
+(void)al_hookOrAddWithOriginSeletor:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector error:(NSError**)error;
@end
more >>