最近在项目中遇到埋点的问题的些问题,埋点是现在很多App中都需要用到的,这个问题可能每个人都能处理,但是怎样来减少埋点所带来的侵入性,怎样用更加简洁的方式来处理埋点问题,怎样减少误埋,如果上线了发现少埋了怎么办?下面个人就分析讨论下有哪些重点、难点:
一、什么是埋点?埋点的作用是什么?
二、常规的处理方式是怎样的?
三、我们可以怎样优化?
四、怎样使用RunTime对其进行优化?
五、在实践中遇到了什么问题以及解决方案?
六、最理想的埋点是什么样的?
七、其中可能存在的问题是什么?
接下来将对其一一做以说明:
一、什么是埋点?埋点的作用是什么?
其实埋点也叫日志上报,其实就是根据需求上报一系列关于用户行为的数据,比如:用户点击了哪个按钮,用户浏览了哪个网站,用户在某个页面停留了多久等数据。这些数据对于运营来说很有用,他们可以用来分析某个功能开发的是不是合理,是不是因为某个地方的不合理而到导致了转化率的下降,从而对我们的App进行相应的改进,我们来看下某个第三方平台提供的埋点实例。
上图中说明了,某个时间对应的事件ID,以及针对这个事件需要关联的字段。下面是后台系统对某个埋点所做的数据统计:
这样我们就可以详细的分析出用户对于App的反馈,从而及时的修改我们的产品。
二、常规的埋点的处理方式是怎样的?
其实很简单,我们就在相应的事件里面加入相关的代码,给服务器上报数据不就得了。如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
|
// 这个一个按钮的响应事件
-
(
void
)
someButtonAction
:
(
UIButton
*
)
someButton
{
// 该按钮需要处理的业务
[
self
upDateSomthing
]
// 开始埋点
// eid:事件id,sa:用户id, cI:当前时间
NSDictionary
*upLoadDic
=
@
{
@"eid"
:
@"311"
,
@"sa"
:
@"706976487532177"
,
@"cI"
:
@"2016-6-4 12:11:34"
}
;
[
ZHUpLoadManager
upLoadWithDic
:upLoadDic
]
;
}
|
这样一个埋点问题就解决了,单同时却隐藏着很多问题:1.这样每点击一个一下按钮就请求一次网络会不会出现性能问题?2.如果这样频繁的数据上报会不会消耗更多的用户流量?3.这样的代码能经受住需求的变更吗?比如字段变了,或者你把cI
看错了,应该是cl
。4.这样的代码会不会造成难以测试?5.这样的频繁上报会不会增加服务器端的压力?6.代码整洁吗?……(程序员的一个好习惯是:这个代码能否经受住需求的变更。)
三、我们可以怎样优化?
- 首先我们可以用一个类,来专门处理这些需要上报的埋点的字段,将这些字段作为常量,例如:
1
2
3
4
5
6
7
8
9
|
// LogManager.h
extern
NSString
*
const
kLogEventKey
;
//事件id
extern
NSString
*
const
kLogUserIdKey
;
//用户id
extern
|