導讀:用戶行爲埋點是用來記錄用戶在操做時的一系列行爲,也是業務作判斷的核心數據依據,若是缺失或者不許確將會給業務帶來不可恢復的損失。閒魚將業務代碼從 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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。