日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

揭秘!如何用Flutter设计一个100%准确的埋点框架?

發布時間:2024/8/23 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 揭秘!如何用Flutter设计一个100%准确的埋点框架? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

阿里妹導讀:用戶行為埋點是用來記錄用戶在操作時的一系列行為,也是業務做判斷的核心數據依據,如果缺失或者不準確將會給業務帶來不可恢復的損失。閑魚將業務代碼從Native遷移到Flutter上過程中,發現原先Native體系上的埋點方案無法應用在Flutter體系之上。而如果只把業務功能遷移過來就上線,是極其不負責任的。因此,經過不斷探索,閑魚技術團隊沉淀了一套Flutter上的高準確率的用戶行為埋點方案,今天由工程師蘭昊來和大家分享一下。

用戶行為埋點定位

先來講講在我們這里是如何定義用戶行為埋點的。在如下用戶時間軸上,用戶進入A頁面后,看到了按鈕X,然后點擊了這個按鈕,隨即打開了新的頁面B。

?

這個時間軸上有如下5個埋點事件發生:

  • 進入A頁面。A頁面首幀渲染完畢,并獲得了焦點。
  • 曝光坑位X。按鈕X處于手機屏幕內,且停留一段時間,讓用戶可見可觸摸。
  • 點擊坑位X。用戶對按鈕X的內容很感興趣,于是點擊了它。按鈕X響應點擊,然后需要打開一個新頁面。
  • 離開A頁面。A頁面失去焦點。
  • 進入B頁面。B頁面首幀渲染完畢,并獲得焦點。

在這里,打埋點最重要的是時機,即在什么時機下的事件中觸發什么埋點,下面來看看閑魚在Flutter上的實現方案。

實現方案

進入/離開頁面

在Native原生開發中,Android端是監聽Activity的onResume和onPause事件來做為頁面的進入和離開事件,同理iOS端是監聽UIViewController的viewWillAppear和viewDidDisappear事件來做為頁面的進入和離開事件。同時整個頁面棧是由Android和iOS操作系統來維護。

在Flutter中,Android和iOS端分別是用FlutterActivity和FlutterViewController來做為容器承載Flutter的頁面,通過這個容器可以在一個Native的頁面內來進行Flutter頁面的切換,即Flutter自己維護了一個Flutter頁面的頁面棧。這樣,原來我們最熟悉的那套在Native原生上的方案在Flutter上無法直接運作起來。

針對這個問題,可能很多人會想到去注冊監聽Flutter的NavigatorObserver,這樣就知道Flutter頁面的進棧(push)和出棧(pop)事件。但是這會有兩個問題:

  • 假設A、B兩個頁面先后進棧(A enter -> A leave -> B enter)。然后B頁面返回退出(B leave),此時A頁面重新可見,但是此時是收不到A頁面push(A enter)的事件。
  • 假設在A頁面彈出一個Dialog或者BottomSheet,而這兩類也會走push操作,但實際上A頁面并未離開。

好在Flutter的頁面棧不像Android Native的頁面棧那么復雜,所以針對第一個問題,我們可以維護一個和頁面棧匹配的索引列表。當收到A頁面的push事件時,往隊列里塞入A的索引。當收到B頁面的push事件時,檢測列表內是否有頁面,如有,則對列表最后一個頁面執行離開頁面事件,再對B頁面執行進入頁面事件,接著往隊列里塞B的索引。當收到B頁面的pop事件時,先對B頁面執行離開頁面事件記錄,再對隊列里存在的最后一個索引對應的頁面(假設為A)進行判斷是否在棧頂(ModalRoute.of(context).isCurrent),如果是,則對A頁面執行進入頁面事件。

針對第二個問題,Route類內有個成員變量overlayEntries,可以獲取當前Route對應的所有圖層OverlayEntry,在OverlayEntry對象中有個成員變量opaque可以判斷當前這個圖層是否全屏覆蓋,從而可以排除Dialog和BottomSheet這種類型。再結合問題1,還需要在上述方案中加上對push進來的新頁面來做判斷是否為一個有效頁面。如果是有效頁面,才對索引列表中前一個頁面做離開頁面事件,且將有效頁面加到索引列表中。如果不是有效頁面,則不操作索引列表。

以上并不是閑魚的方案,只是筆者給出的一個建議。因為閑魚APP在一開始落地Flutter框架時,就沒有使用Flutter原生的頁面棧管理方案,而是采用了Native+Flutter混合開發的方案,因此接下來也是基于此來闡述閑魚的方案。

閑魚的方案如下(以Android為例,iOS同理):

注:首次打開指的是基于混合棧新打開一個頁面,非首次打開指的是通過回退頁面的方式,在后臺的頁面再次到前臺可見。

?

?

看到這個方案可能會有人問,為什么這么繞,為什么不全部交給Native側去直接管理呢?交給Native側去直接管理這樣做針對非首次打開這個場景是合適的,但是對首次打開這個場景卻是不合適的。但是在首次打開這個場景下,onResume時Flutter頁面尚未初始化,此時還不知道頁面信息,因此也就不知道進入了什么頁面,所以需要在Flutter頁面初始化(init)時再回過來調Native側的進入頁面埋點接口。而為了避免開發人員去關注是否為首次打開Flutter頁面,因此我們統一在Flutter側來直接觸發進入/離開頁面事件。

曝光坑位

先講下曝光坑位在我們這里的定義,我們認為圖片和文本是有曝光意義的,其他用戶看不見的是沒有曝光意義的,在此之上,當一個坑位同時滿足以下兩點時才會被認為是一次有效曝光:

  • 坑位在屏幕可見區域中的面積大于等于坑位整體面積的一半。
  • 坑位在屏幕可見區域中停留超過500ms。

基于此定義,我們可以很快得出如下圖所示的場景,在一個可以滾動的頁面上有A、B、C、D共4個坑位。其中:

  • 坑位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) {調用曝光埋點接口} }

點擊坑位

點擊坑位埋點沒什么難點,很容易就可以想到下面的方案:

?

效果

經過多輪迭代和優化,目前線上Flutter頁面的埋點準確率已經達到100%,有力地支持了業務的分析和判斷。同時這套方案讓業務同學在做開發時,對于頁面進入/離開、曝光坑位可以做到無感知,即不用關心何時去觸發,做到了簡單易用和無侵入性。

未來

此外,針對頁面進入/離開這個場景,由于閑魚是基于Flutter Boost混合棧的方案,因此我們的解決方案還不夠通用。不過未來隨著閑魚上的Flutter頁面越來越多,我們后續也會去實現基于Flutter原生的方案。


原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。

總結

以上是生活随笔為你收集整理的揭秘!如何用Flutter设计一个100%准确的埋点框架?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产女主播喷水高潮网红在线 | 亚洲在线激情 | 在线一区二区不卡 | 久久久久亚洲av成人网人人网站 | www.午夜av | 欧美一区三区二区在线观看 | 亚洲av成人无码久久精品 | 免费在线观看av网站 | 黄色录像二级片 | 热99| 男男gay动漫| 国产成人精品一区二区在线观看 | 香蕉视频污在线观看 | 日日夜夜中文字幕 | 成人听书哪个软件好 | 黑白配av| 明日叶三叶 | 欧美亚洲国产另类 | 欧美三级手机在线观看 | 97操操| 亚洲色婷婷一区二区三区 | 国产真实生活伦对白 | 中文天堂在线播放 | 日韩xx视频 | 动漫一区二区 | 午夜欧美精品 | 日韩国产精品视频 | 国产精品av一区二区 | 亚洲精品av在线 | wwwav视频在线观看 | 国内成人自拍 | 国产三级三级看三级 | 欧美日韩性 | 色悠悠久久综合 | 7777久久亚洲中文字幕 | 婷婷国产成人精品视频 | 操人视频免费看 | 黑人巨大精品 | 亚洲av无码久久精品色欲 | 无码精品人妻一区二区三区湄公河 | 又大又硬又爽免费视频 | 岛国大片在线 | 欧美日韩电影一区二区三区 | 亚洲福利影院 | 国产一区二区在线播放 | 国产尤物视频在线 | 91一区二区三区在线 | 91成人免费看 | 日韩av激情 | 亚洲无人区码一码二码三码的含义 | 91操操| 久久久久久久久久久国产精品 | 久久免费在线观看视频 | 这里只有精品66 | 可以看的av网站 | 欧美一区二区最爽乱淫视频免费看 | 绿帽h啪肉np辣文 | 免费色网站 | 国产精品日日夜夜 | 美女毛片 | 91av在线看| 成人欧美一区二区三区在线观看 | 国产精品一区在线观看你懂的 | 国产91高清 | 日本三级一区二区三区 | 韩国av不卡| 97色吧 | 午夜小影院 | 亚洲美女中文字幕 | 欧美,日韩,国产在线 | 亚洲欧美日韩久久 | 国产人妻久久精品一区二区三区 | 日本欧美黄色 | 成年人毛片| 亚洲性xxx | 91综合色| 第一章婶婶的性事 | 亚洲综合网av | 国产日韩av在线播放 | 人人看人人射 | 黄色一级免费看 | www免费黄色 | 91大片免费看 | 欧美日韩免费在线 | 中文字幕精品国产 | 黄色国产在线观看 | 天天干 夜夜操 | 国产无套内射又大又猛又粗又爽 | 国产777| 国产成人在线一区 | 欧美性视频在线播放 | 最新激情网 | 一区二区三区中文视频 | 亚洲欧美中文日韩在线 | 糖心视频在线 | 国产一级爱c视频 | 久久波多野 | 看片网站在线观看 | 中文字幕乱码人妻一区二区三区 |