摘要:目前埋點(diǎn)分為兩種方式,有碼與無(wú)碼埋點(diǎn)。本文主要介紹無(wú)碼埋點(diǎn)的技術(shù)實(shí)現(xiàn)。無(wú)碼埋點(diǎn)的實(shí)現(xiàn)流程可視化視圖圈選,在頁(yè)面上會(huì)出現(xiàn)浮動(dòng)的圓圈,拖動(dòng)圓圈至想配置事件的控件上,將會(huì)彈出輸入事件的彈框。
隨著大數(shù)據(jù)時(shí)代的到來(lái),數(shù)據(jù)采集也已經(jīng)變的越來(lái)越重要。前端埋點(diǎn)作為一個(gè)比較成熟的數(shù)據(jù)接入手段被廣泛應(yīng)用著。目前埋點(diǎn)分為兩種方式,有碼與無(wú)碼埋點(diǎn)。有碼埋點(diǎn)比較容易理解,即調(diào)用SDK的API,在代碼中插入埋點(diǎn)的相關(guān)代碼,實(shí)現(xiàn)用戶行為采集。由于我們?cè)陂_發(fā)項(xiàng)目的時(shí)候,埋點(diǎn)都是手動(dòng)的,每次業(yè)務(wù)需求的改變都要到處埋點(diǎn),而無(wú)碼埋點(diǎn),即不需要手動(dòng)插入代碼,只需要前期進(jìn)行相關(guān)配置,SDK自動(dòng)采集用戶行為,極大程度避免了因需求變更、埋點(diǎn)錯(cuò)誤等原因?qū)е碌闹匦侣顸c(diǎn)繁復(fù)工作。本文主要介紹無(wú)碼埋點(diǎn)的技術(shù)實(shí)現(xiàn)。
無(wú)碼埋點(diǎn)的實(shí)現(xiàn)流程
1.可視化視圖圈選,在頁(yè)面上會(huì)出現(xiàn)浮動(dòng)的圓圈,拖動(dòng)圓圈至想配置事件的控件上,將會(huì)彈出輸入事件的彈框。
2.在上一步的彈框中輸入自定義的事件名稱,名稱將會(huì)和視圖的viewPath綁定起來(lái)。viewPath是視圖的唯一標(biāo)識(shí),在下文中將詳細(xì)講解。
3.用戶點(diǎn)擊了控件,判斷控件是否綁定過(guò)事件,如綁定則進(jìn)行事件上傳。
實(shí)現(xiàn)流程中的技術(shù)點(diǎn)
可視化視圖圈選實(shí)現(xiàn)
自定義UIWindow的子類,當(dāng)做懸浮小圓圈,添加UIPanGestureRecognizer手勢(shì),根據(jù)手勢(shì)的位移,設(shè)置懸浮框的位移。手勢(shì)停止時(shí)獲取懸浮窗中心點(diǎn)的坐標(biāo)。
遍歷主window上的子視圖,找到包含上述懸浮窗中心點(diǎn)且能響應(yīng)用戶交互的最里層視圖,即為用戶可以圈選的視圖。
參考iOS控件的消息傳遞鏈,有個(gè)核心方法。UIView hitTest:(CGPoint)point withEvent:(UIEvent *)event。此API自動(dòng)遍歷子視圖,找到包含point的視圖,event傳nil。由于event參數(shù)是nil,最終找到的視圖并不一定是能響應(yīng)用戶手勢(shì)的視圖,如果不能響應(yīng)則遍歷其父視圖,直到找到能響應(yīng)用戶行為的視圖。
圈選視圖綁定事件
視圖唯一標(biāo)識(shí)viewPath生成,上述步驟已經(jīng)拿到了圈選的視圖。如何確定視圖的viewPath也是重點(diǎn)。viewPath需要整個(gè)應(yīng)用唯一,才可以區(qū)別不同的事件。由于是無(wú)碼,所以只能從視圖本身的屬性去分析。我們可以把App的視圖結(jié)構(gòu)理解成樹的概念,樹的根節(jié)點(diǎn)是UIWindow,樹的枝干由UIViewController和UIView組成,葉子節(jié)點(diǎn)都是UIView。那么從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的路徑可以看做是唯一的。也就是視圖的viewPath。下面介紹下實(shí)現(xiàn)的邏輯,viewPath由兩部分組成,第一部分是節(jié)點(diǎn)路徑,另一部分是與之對(duì)應(yīng)的節(jié)點(diǎn)index。節(jié)點(diǎn)路徑是由每個(gè)節(jié)點(diǎn)的Class拼接而成,節(jié)點(diǎn)index,就是節(jié)點(diǎn)在父節(jié)點(diǎn)中的下標(biāo),比如子視圖在父視圖的subviews數(shù)組中的下標(biāo)。下圖是遍歷節(jié)點(diǎn)的邏輯圖。
計(jì)算節(jié)點(diǎn)的index,這個(gè)步驟,有種特殊的視圖需要注意,可復(fù)用視圖的index是跟數(shù)據(jù)源相關(guān)的,比如UITableViewCell,此類視圖的index不能使用父視圖的subviews的下標(biāo)代替,應(yīng)該使用數(shù)據(jù)源的下標(biāo)代表,比如cell的indexPath.section:indexPath.row。下面給出一個(gè)簡(jiǎn)單視圖和可復(fù)用視圖的viewPath的例子。TestViewController-UIView-UIButton&0-0-0和TableViewController-UITableView-UITableViewCell&0-0-1:0。
如何檢測(cè)用戶觸發(fā)了綁定了事件ID的視圖也是重點(diǎn),此處運(yùn)用的核心技術(shù)是runtime中Method Swizzle。下面介紹一下針對(duì)不同類型的控件,如何hook相應(yīng)的方法。
UIControl類型的控件hook – (void)sendAction:(SEL) to:(id)target forEvent:(UIEvent *)event
UIScrollView,UITextView,UITableView,UICollectionView 類型的控件,先hook -(void)setDelegate:(id)delegate 方法,然后再hook想要采集事件的代理方法,例如 textViewDidBeginEditing 、tableview:(UITableView )tableview didSelectRowAtIndexPath:(NSIndexPath )indexPath 等。
帶手勢(shì)事件的視圖 hook -(void)addGestureRecognizer方法,并在方法實(shí)現(xiàn)中給手勢(shì)對(duì)象添加新的target和action ,- (void)addTarget:(id)target action:(SEL)action。
總結(jié)
無(wú)碼埋點(diǎn)的關(guān)鍵技術(shù),就是以上分析的幾點(diǎn),首先通過(guò)可視化圈選拿到需要綁定事件視圖,并生成唯一標(biāo)識(shí)viewPath,通過(guò)hook系統(tǒng)控件的方法,拿到用戶觸發(fā)的視圖,生成視圖的viewPath與本地的事件列表比對(duì),比對(duì)成功則上傳viewPath對(duì)應(yīng)的事件。
本文原創(chuàng)首發(fā)于Cobub官網(wǎng)博客,轉(zhuǎn)載請(qǐng)注明出處!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/17637.html
摘要:除此之外,無(wú)碼科技還推出抽獎(jiǎng)助手和等流量和工具產(chǎn)品。目前無(wú)碼科技旗下用戶數(shù)過(guò)億,由醫(yī)療用戶和非醫(yī)療用戶構(gòu)成。無(wú)碼科技產(chǎn)品負(fù)責(zé)人邱岳介紹。此外,在高性能的支持下,無(wú)碼科技在人工智能領(lǐng)域的技術(shù)得以不斷推進(jìn)。無(wú)癥狀新冠疫情要如何判斷?家附近哪里有疫苗接種點(diǎn)接種疫苗有什么注意事項(xiàng)……新冠疫情爆發(fā)后,醫(yī)療小程序就診問(wèn)問(wèn)上,關(guān)于新冠疫情的搜索量出現(xiàn)明顯增長(zhǎng)。就診問(wèn)問(wèn)是無(wú)碼科技旗下專注醫(yī)療健康搜索的小程序...
摘要:私有化私有化解決方案有效的防止了用戶數(shù)據(jù)的泄露,為業(yè)務(wù)提供強(qiáng)有力的數(shù)據(jù)支撐,深度分析更容易,數(shù)據(jù)應(yīng)用靈活更安全,定制化貼近業(yè)務(wù)。 線上流量紅利逐漸消失的今天,產(chǎn)品的獲客成本從幾元,飆升到了現(xiàn)在的幾百元,甚至上千元,流量大戰(zhàn)悄然打響!而 微信社會(huì)中的小程序,憑借著離消費(fèi)者一指之遙的距離,成為商家不被淘汰的制勝法寶 。2019年4月,開源的用戶行為分析廠商Cobub推出全渠道的用戶增長(zhǎng)利器...
閱讀 2827·2021-11-22 14:45
閱讀 984·2021-10-15 09:41
閱讀 1150·2021-09-27 13:35
閱讀 3960·2021-09-09 11:56
閱讀 2692·2019-08-30 13:03
閱讀 3255·2019-08-29 16:32
閱讀 3367·2019-08-26 13:49
閱讀 844·2019-08-26 10:35