一、定义
APP埋点自动采集是指用户在APP内的操作行为自动采集并上报日志,其表现在APP上的元素(按钮、图片等)的行为主要分为点击和曝光行为。其中曝光意为该元素在可视区域停留时长达到一定阈值,即标记为一次曝光行为。本文主要定位为对iOS端内部自动采集技术的原理剖析。
二、核心原理
对于曝光行为与点击行为的检测原理是完全不同的,接下来会从两种不同的行为检测机制开始介绍.
2.1 曝光检测原理
2.1.1 自动曝光相关概念
1.有效曝光:视图元素在有效曝光面积的情况下,停留时长达到有效的曝光时长,才能算一次有效曝光
2.曝光面积::视图元素在window显示的面积
3.曝光时长:视图元素由显示到隐藏的时间间隔
4.业务参数:业务自定义参数
2.1.2 判断一个view是否显示的几个关键因素
1.hidden,layer.hidden:显而易见,这个属性代表view是否显示.
2.frame:frame的修改,也会决定view是否被看见,如果已经移除window外了,则判断为代表隐藏;
3.alpha:alpha为0,则为隐藏
所以简单的判断条件如下
+ (BOOL)isViewVisible:(UIView *)view{
if (!view.window || view.hidden || view.layer.hidden || !view.alpha) {
return NO;
}
}
4.view面积的计算是较复杂的逻辑: 如果面积大于exposureAreaThreshold(自定义有效面积),则代表视图显示
CGRect viewRectInWindow = [view convertRect:view.bounds toView:view.window];
CGRect intersectRect = CGRectIntersection(view.window.bounds, viewRectInWindow);
if (intersectRect.size.width != 0.f && intersectRect.size.height != 0.f) {
// modify size threshold,80%
CGFloat areaThreshold = exposureAreaThreshold;
CGFloat areaReal = intersectRect.size.width * intersectRect.size.height / (viewRectInWindow.size.width * viewRectInWindow.size.height);
if (areaReal >= areaThreshold) {
return YES;
} else{
return NO;
}
}
2.1.3 自动曝光检测时机
由上述的几个关键因素很容易得出曝光检测的时机:
检测hidden:
-[UIView setHidden:]
检测Alpha
-[UIView setAlpha:]
检测window
-[UIView didMoveToWindow]
检测显示面积
-[UIView setFrame:]
-[UIScrollView setContentOffset:];
因此我们会通过Swizzle上述几个方法,作为view曝光检测的时机
@implementation UIView (ViewExposure)
+ (void)doSwizzleForUTViewExposure {
//for UIView's hidden
[HookRegister swizzleInstanceMe