导读:用户行为埋点是用来记录用户在操做时的一系列行为,也是业务作判断的核心数据依据,若是缺失或者不许确将会给业务带来不可恢复的损失。闲鱼将业务代码从 Native 迁移到 Flutter 上过程当中,发现原先 Native 体系上的埋点方案没法应用在 Flutter 体系之上。而若是只把业务功能迁移过来就上线,是极其不负责任的。所以,通过不断探索,闲鱼技术团队沉淀了一套 Flutter 上的高准确率的用户行为埋点方案,今天由工程师兰昊来和你们分享一下。微信
用户行为埋点定位架构

-
进入 A 页面。A 页面首帧渲染完毕,并得到了焦点。 -
曝光坑位 X 。按钮X处于手机屏幕内,且停留一段时间,让用户可见可触摸。 -
点击坑位 X 。用户对按钮X的内容很感兴趣,因而点击了它。按钮 X 响应点击,而后须要打开一个新页面。 -
离开 A 页面。A 页面失去焦点。 -
进入 B 页面。B 页面首帧渲染完毕,并得到焦点。
实现方案app
-
假设 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;
-
容器相对屏幕的偏移量 -
坑位相对容器的偏移量 -
坑位的位置和宽高 -
容器的位置和宽高
其中坑位和容器的宽和高很容易获取和计算,这里就再也不累述。编辑器
得到容器相对屏幕的偏移量flex
//监听容器滚动,获得容器的偏移量double _scrollContainerOffset = scrollNotification.metrics.pixels;
优化
ui
//曝光坑位Widget的contextfinal 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);
url
spa
if (当前坑位是invisible && 曝光比例 >= 0.5) { 记录当前坑位是visible状态 记录出现时间} else if (当前坑位是visible && 曝光比例 < 0.5) { 记录当前坑位是invisible状态 if (当前时间-出现时间 > 500ms) { 调用曝光埋点接口 }}

效果
将来




本文分享自微信公众号 - 淘系技术(AlibabaMTT)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。