阿里妹导读:用户行为埋点是用来记录用户在操作时的一系列行为,也是业务做判断的核心数据依据,如果缺失或者不准确将会给业务带来不可恢复的损失。闲鱼将业务代码从Native迁移到Flutter上过程中,发现原先Native体系上的埋点方案无法应用在Flutter体系之上。而如果只把业务功能迁移过来就上线,是极其不负责任的。因此,经过不断探索,闲鱼技术团队沉淀了一套Flutter上的高 准确率 的用户行为埋点方案,今天由工程师兰昊来和大家分享一下。
-
进入A页面。A页面首帧渲染完毕,并获得了焦点。 -
曝光坑位X。按钮X处于手机屏幕内,且停留一段时间,让用户可见可触摸。 -
点击坑位X。用户对按钮X的内容很感兴趣,于是点击了它。按钮X响应点击,然后需要打开一个新页面。 -
离开A页面。A页面失去焦点。 -
进入B页面。B页面首帧渲染完毕,并获得焦点。
-
假设A、B两个页面先后进栈(A enter -> A leave -> B enter)。然后B页面返回退出(B leave),此时A页面重新可见,但是此时是收不到A页面push(A enter)的事件。 -
假设在A页面弹出一个Dialog或者BottomSheet,而这两类也会走push操作,但实际上A页面并未离开。
先讲下曝光坑位在我们这里的定义,我们认为图片和文本是有曝光意义的,其他用户看不见的是没有曝光意义的,在此之上,当一个坑位同时满足以下两点时才会被认为是一次有效曝光:
-
坑位在屏幕可见区域中的面积大于等于坑位整体面积的一半。 -
坑位在屏幕可见区域中停留超过500ms。
-
坑位A已经滑出了屏幕可见区域,即invisible; -
坑位B即将向上从屏幕中可见区域滑出,即visible->invisible; -
坑位C还在屏幕中央可视区域内,即visible; -
坑位D即将滑入屏幕中可见区域,invisible->visible;
-
容器相对屏幕的偏移量 -
坑位相对容器的偏移量 -
坑位的位置和宽高 -
容器的位置和宽高
其中坑位和容器的宽和高很容易获取和计算,这里就不再累述。
获得容器相对屏幕的偏移量
//监听容器滚动,得到容器的偏移量
double _scrollContainerOffset = scrollNotification.metrics.pixels;
//曝光坑位Widget的context
final RenderObject childRenderObject = context.findRenderObject();
final RenderAbstractViewport viewport = RenderAbstractViewport.of(childRenderObject);
if (viewport == null) {
return;
}
if (!childRenderObject.attached) {
return;
}
//曝光坑位在容器内的偏移量
final RevealedOffset offsetToRevealTop = viewport.getOffsetToReveal(childRenderObject, 0.0);
if (当前坑位是invisible && 曝光比例 >= 0.5) {
记录当前坑位是visible状态
记录出现时间
} else if (当前坑位是visible && 曝光比例 < 0.5) {
记录当前坑位是invisible状态
if (当前时间-出现时间 > 500ms) {
调用曝光埋点接口
}
}