ios无痕埋点_移动端无痕埋点实践详解(二)
0x01 前言
在移動端無痕埋點實踐詳解(一)這篇文章大致總結(jié)了移動端無痕埋點的基本原理。主要介紹了什么是無痕埋點,無痕埋點的基礎(chǔ)數(shù)據(jù)流程以及在Android系統(tǒng)上總體思路。這篇文章著重總結(jié)下無痕埋點方案的實施過程中在Android和iOS系統(tǒng)上幾個細(xì)節(jié)的解決方案。
0x02 xpath
2.1 什么是xpath
xpath是移動端定義可操作區(qū)域的數(shù)字標(biāo)識,是用來標(biāo)識可操作的控件的。既然想要通過一串字符標(biāo)識在移動端app中的可操作控件,那么xpath的生成規(guī)則需要滿足以下幾個原則:
唯一性: 在當(dāng)前app中不存在不同控件對應(yīng)相同Xpath
穩(wěn)定性: 不同版本app中,在沒有頁面結(jié)構(gòu)變更的情況下,不同版本中相同頁面中相同控件的Xpath要保持不變
2.1 Android中如何生成xpath
在滿足上述xpath原則的基礎(chǔ)上,可通過以下幾個參數(shù)作為組成XPath的生成參數(shù):
頁面:標(biāo)記當(dāng)前控件所在的頁面url,Webview頁面為其html的url,native頁面url可定義該頁面的virtual url
頁面中位置:如何描述一個控件在該頁面的位置,在Android系統(tǒng)中很容易想到DecorView和頁面子view的關(guān)系。使用View到DecorView的位置關(guān)系來描述視圖控件在該頁面中的相對位置。
控件標(biāo)記:這里的控件標(biāo)記指的是相對于相同父容器的兄弟視圖來說,如何更好的區(qū)別彼此。這里很容易能夠想到view id。但是這里并不推薦使用view id作為標(biāo)記。因為id是在版本迭代過程中很容易因為資源數(shù)量的變化而發(fā)生變化。并不能滿足標(biāo)記穩(wěn)定性的原則,目前在Android上我選擇resource name作為視圖控件的標(biāo)記。在ios上
綜上所述就可以得到以下的XPath生成方式。
$ xpath = Md5(url+root path + resource name)$
2.2 iOS系統(tǒng)中如何生成xpath
2.3 如何識別xpath
在用戶產(chǎn)生用戶點擊數(shù)據(jù)的過程中,埋點系統(tǒng)上報控件xpath給埋點后臺,但是在實際的數(shù)據(jù)分析過程中需要知道每個xpath對應(yīng)的控件和區(qū)塊名稱具體是什么。在每個電商系統(tǒng)中針對埋點都會有一套自己的位置模型規(guī)范,簡稱SPM(super position model)。所以針對最終的數(shù)據(jù)分析和統(tǒng)計需要一個xpath到spm的映射關(guān)系,將實際產(chǎn)生的xpath埋點數(shù)據(jù)轉(zhuǎn)換成業(yè)務(wù)中的SPM。實現(xiàn)方式也很簡單,只需要在開發(fā)版本中提供一個編輯模式,將移動端本地生成的xpath通過一個編輯工具轉(zhuǎn)換成SPM數(shù)據(jù)就可以了,簡單的效果圖如下所示:
0x03 Android如何記錄頁面跳轉(zhuǎn)
在考慮記錄頁面跳轉(zhuǎn)的方案時,可能最先想到的是在通過統(tǒng)一路由跳轉(zhuǎn)的方式跟蹤所有頁面跳轉(zhuǎn),但是實際的項目中首先你得有個統(tǒng)一的路由不是?在面對已有的項目代碼從工作量和效果上來說這種方式都不是最佳方案。即便是已有統(tǒng)一的路由方案也很難保證沒有錯埋漏埋的情況存在。別忘記 ActivityLifecycleCallbacks
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39public class RuntimeActivityCallbacks implements Application.ActivityLifecycleCallbacks {
private Map mPageResumeTime = new HashMap<>();
/**
* 頁面對應(yīng)的referrerId,一個activity可能有多個子頁面,一個activity的referrerId為當(dāng)前顯示的子頁面的referrerId
*/
private Map mPageReferrerMap = new HashMap<>();
@Override
public void onActivityResumed(Activity activity) {
// 針對頁面的跟蹤
if (activity instanceof IPageTracker) {
IPageTracker pageTracker = (IPageTracker) activity;
String url = pageTracker.getReferrerId();
mPageResumeTime.put(url, System.currentTimeMillis());
mPageReferrerMap.put(activity.hashCode(), url);
AppTraceTool.traceOpenPage(url, ModuleManager.getTopPageUrl());
// 保存當(dāng)前頁面為top
ModuleManager.setTopPageUrl(url);
} else {
ModuleManager.setTopPageUrl("unknown");
}
}
@Override
public void onActivityStopped(Activity activity)
// 針對頁面的跟蹤
if (activity instanceof IPageTracker) {
IPageTracker pageTracker = (IPageTracker) activity;
String url = pageTracker.getReferrerId();
mPageResumeTime.remove(url);
mPageReferrerMap.remove(activity.hashCode());
AppTraceTool.traceLeavePage(url, second);
}
}
}
0x04 如何使用無痕埋點方案記錄業(yè)務(wù)數(shù)據(jù)
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的ios无痕埋点_移动端无痕埋点实践详解(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pilt图像处理_详解python op
- 下一篇: spark 写tidb_tidb使用坑记