概述
跟蹤代碼管理器是一個代碼管理系統(tǒng),可以輕松地更新移動應(yīng)用上的代碼和代碼段被觸發(fā)的時機(jī),在有預(yù)先埋點(diǎn)的情況下,完成對第三方sdk代碼或自定義代碼邏輯的“動態(tài)”管理。
例如通過tagmanager添加和更新Google Analytics等第三方sdk代碼或自定義代碼,而無需修改應(yīng)用代碼。這樣既減少了錯誤,也免除了配置代碼時向開發(fā)者求助的麻煩。
基本概念
TagManager必須了解的一些基本概念,比如容器,代碼,數(shù)據(jù)層、觸發(fā)器和變量等。
簡單的說,一個公司注冊一個賬號,可以創(chuàng)建多個容器,比如一個android應(yīng)用對應(yīng)一個容器,容器里面主要包含了代碼(tags)、觸發(fā)器(triggers),宏變量(variables)等。
容器
對于android端而言,容器就是提供給sdk的一份二進(jìn)制配置文件(有導(dǎo)出的json文件),sdk可以更具容器配置文件來進(jìn)行處理。sdk也可以從服務(wù)器獲取最新的配置文件來替換當(dāng)前本地的文件。
通過獲取容器,開發(fā)者可以獲取動態(tài)獲取集合值類型的宏變量值,要處理替換部分預(yù)設(shè)宏變量的參數(shù),比如app id等,也可以獲取容器相關(guān)的信息等。
代碼
代碼指的是向第三方sdk發(fā)送信息的代碼段。如果不使用諸如跟蹤代碼管理器這樣的代碼管理解決方案,則需要將這些代碼段直接添加到移動應(yīng)用的文件中。而使用tagmanager,就無需再在源代碼文件中維護(hù)每個代碼段,而只需在跟蹤代碼管理器界面中指定希望觸發(fā)的代碼,以及希望的觸發(fā)時間。
對于android端而言,代碼就是指定了調(diào)用第三方sdk的信息,比如說可以設(shè)置tag產(chǎn)品為Google Analytics時,指定該第三方sdk需要配置的的Tracking ID(追蹤id)、追蹤類型(相當(dāng)于sdk觸發(fā)的事件類型,比如說指定為app view事件)等信息。
代碼效果相當(dāng)于就是把我們需要在嵌入第三方sdk后要做的事件,轉(zhuǎn)由tagmanager完成觸發(fā),不需要再顯式地調(diào)用第三方sdk的代碼。這樣做的好處有下面幾點(diǎn):
- 只需tagmanager實(shí)現(xiàn)一次觸發(fā)動作,減少調(diào)用多個sdk的代碼實(shí)現(xiàn),相當(dāng)于代碼統(tǒng)一管理,避免重復(fù)多個sdk調(diào)用代碼。
- 后臺可以動態(tài)配置代碼,客戶端獲取到新的容器配置后,會解析配置文件后根據(jù)新的代碼和規(guī)則,改變觸動動作的時機(jī)以及調(diào)用第三方sdk的方法具體參數(shù),實(shí)現(xiàn)“動態(tài)”配置(在必須先埋好點(diǎn)的基礎(chǔ)上)。
- 方便后期替換支持的第三方sdk時,可以做到項(xiàng)目代碼不改變(在tagmanager支持的第三方sdk,不需要再顯式調(diào)用第三方sdk觸發(fā)代碼),當(dāng)然所有的前提的都是要埋點(diǎn)。
觸發(fā)器
首先需要再次明確一點(diǎn):tagmanager并不是減少了埋點(diǎn)的數(shù)量,該埋的位置照樣還是要埋,只不過是將原來調(diào)用第三方sdk觸發(fā)事件的方法轉(zhuǎn)由tagmanager來完成,相當(dāng)于tagmanaager作為第三方sdk的代理者(其實(shí)是后面的數(shù)據(jù)層實(shí)現(xiàn)了數(shù)據(jù)映射)。
觸發(fā)器,簡單的說就是一組行為觸發(fā)的條件規(guī)則,滿足條件的行為才會被觸發(fā)。這也是tagmanager的“動態(tài)”性表現(xiàn)之一。也就是用戶行為要觸發(fā)代碼前,需要達(dá)到觸發(fā)器設(shè)置的條件規(guī)則才能執(zhí)行,這個觸發(fā)器配置內(nèi)容包含在從后端獲取的容器配置文件中。
“觸發(fā)器”是指在運(yùn)行時求值結(jié)果為“true”或“false”的條件。求值方法是對比“變量”的值與在定義觸發(fā)器時指定的值,附加到代碼的觸發(fā)器用于控制該代碼在何時觸發(fā)或不觸發(fā)。
“tagmanager變量”是指經(jīng)過配置的“名稱-值”對,其中的值在運(yùn)行時填充。tagmanager有許多內(nèi)置變量,還可以配置自定義變量。
例如,預(yù)定義的變量“url”始終包含當(dāng)前加載的網(wǎng)頁的網(wǎng)址。如果希望僅針對網(wǎng)頁 example.com/purchase/receipt.html觸發(fā)代碼,那么需要定義這樣的規(guī)則:
事件:網(wǎng)頁瀏覽
觸發(fā)器類型:網(wǎng)頁瀏覽
觸發(fā)條件:某些網(wǎng)頁瀏覽
當(dāng)以下條件的結(jié)果為“true”時觸發(fā)代碼:
網(wǎng)址包含 example.com/purchase/receipt.html
可以根據(jù)自己的需要定義變量(多種宏類型變量),每個變量都包含需要在運(yùn)行時使用的某些信息。然后,可以在觸發(fā)器條件中使用這些變量,或者通過這些變量將信息傳遞給代碼。
常見的觸發(fā)條件:
條件 |
---|
包含 |
開頭為 |
結(jié)尾為 |
匹配正則表達(dá)式 |
與正則表達(dá)式相匹配(忽略大小寫) |
小于 |
小于或等于 |
大于 |
不等于 |
不包含 |
開頭不是 |
結(jié)尾不是 |
不匹配正則表達(dá)式 |
與正則表達(dá)式不匹配(忽略大小寫) |
宏變量
在tagmanager中變量都是具有固定的類型匹配的.
- 已啟用廣告跟蹤:對于 Android,如果啟用了廣告跟蹤,該變量返回 true,如果用戶選擇停用針對用戶興趣的廣告,則返回 false。在 Android 開發(fā)者中心中了解詳情。v4 以前的 SDK 版本將始終返回 false。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。
- 應(yīng)用 ID:該值設(shè)置為程序包名稱 (Android) 或捆綁包 ID (iOS)。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。
- 應(yīng)用名稱:該值設(shè)置為當(dāng)前正在運(yùn)行的應(yīng)用的名稱。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。
- 應(yīng)用版本號:該值設(shè)置為當(dāng)前正在運(yùn)行的應(yīng)用的版本。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。
- 常量:該值設(shè)置為提供的字符串。
- 容器 ID:該值為該容器的公共 ID(如 GTM-ABC42)。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。
- 容器版本號:當(dāng)容器處于預(yù)覽模式時,此變量值為容器的預(yù)覽版本號。在其他情況下,此變量值是容器的實(shí)際版本號。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。
- 設(shè)備 ID:對于 Android,該值設(shè)置為設(shè)備 ID。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。
- 設(shè)備名稱:該值設(shè)置為當(dāng)前正在運(yùn)行的應(yīng)用的設(shè)備名稱(如“Samsung Android”、“Android SDK built for x86”)。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。
- 事件名稱:在應(yīng)用中執(zhí)行以下代碼時,該值設(shè)置為“eventNameXYZ”:
- 事件參數(shù):該值設(shè)置為針對給定鍵記錄的 Firebase Analytics 事件參數(shù)值。
- Firebase 用戶屬性:該值設(shè)置為給定鍵的 Firebase Analytics 用戶屬性值。
- 函數(shù)調(diào)用:該值設(shè)置為調(diào)用預(yù)注冊的函數(shù)所返回的值。要了解詳情,請參閱 SDK 文檔(Android 或 iOS)。
- 用于廣告的 ID:對于 Android,該值設(shè)置為廣告 ID。在 Android 開發(fā)者中心中了解詳情。v4 以前的 SDK 版本將始終返回 ''(空字符串)。
- 語言:該值設(shè)置為兩個字母的語言代碼,用于表示用戶設(shè)置的設(shè)備語言。移動應(yīng)用容器中會提供此類型的預(yù)定義變量,無需定義這一類型的新變量。
- 對照表:該值根據(jù)對照表中的說明進(jìn)行設(shè)置。對照表包含兩列(下表中不包含任何數(shù)據(jù),數(shù)據(jù)的使用方法在下文中介紹):
操作系統(tǒng)版本:該值設(shè)置為安裝應(yīng)用的操作系統(tǒng)的版本。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。 - 平臺:該值設(shè)置為當(dāng)前正在運(yùn)行的應(yīng)用所屬的平臺(如“Android”)。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。
- 隨機(jī)數(shù)字:該值設(shè)置為介于 0 到 2147483647 之間的一個隨機(jī)數(shù)字。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。
- 屏幕分辨率:該值設(shè)置為當(dāng)前正在運(yùn)行應(yīng)用的設(shè)備的屏幕分辨率。格式為“<寬>x<高>”,例如“1024x768”。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。
- SDK 版本:該值設(shè)置為安裝應(yīng)用的操作系統(tǒng)的 SDK 版本。移動應(yīng)用容器中會提供此類型的內(nèi)置變量,無需定義這一類型的新變量。
- 操作系統(tǒng)版本:該值設(shè)置為安裝應(yīng)用的操作系統(tǒng)的版本。
- 平臺:該值設(shè)置為目前正在運(yùn)行應(yīng)用的平臺(“Android”或“iOS”其中之一)。移動應(yīng)用容器中會提供此類型的預(yù)定義變量,無需定義這一類型的新變量。
- 隨機(jī)數(shù):該值設(shè)置為介于 0 到 2147483647 之間的一個隨機(jī)數(shù)。
- 屏幕分辨率:該值設(shè)置為當(dāng)前正在運(yùn)行應(yīng)用的設(shè)備的屏幕分辨率。格式為“寬 x 高”,例如“1024x768”。移動應(yīng)用容器中會提供此類型的預(yù)定義變量,無需定義這一類型的新變量。
- SDK 版本:該值設(shè)置為安裝應(yīng)用的操作系統(tǒng)的 SDK 版本。移動應(yīng)用容器中會提供此類型的預(yù)定義變量,無需定義這一類型的新變量。
數(shù)據(jù)層映射
數(shù)據(jù)層是一種對象,可配置希望傳遞到tagmanager的信息。這需要配置數(shù)據(jù)層變量,用來采集這些值以備日后使用。要使tagmanager評估數(shù)據(jù)層變量的值,系統(tǒng)還必須推送事件,使用push來完成這個操作。
在android中,數(shù)據(jù)層就是維持了一個事件隊(duì)列,開發(fā)者通過push一個包含key-value的map對象來添加到隊(duì)列中,當(dāng)push接受到一個key=event的是對象時,將把隊(duì)列中的事件內(nèi)容提取出來,并匹配容器中觸發(fā)器規(guī)則條件,兩者相符合的即觸發(fā)相應(yīng)代碼邏輯。因此數(shù)據(jù)層包含了接收開發(fā)者push過來的事件map對象,包含了容器中配置的數(shù)據(jù)層變量信息等。
Google TagManager實(shí)際示例
先在項(xiàng)目代碼中通過getDataLayer()獲取數(shù)據(jù)層對象 可以使用push或pushEvent方法將數(shù)據(jù)傳到數(shù)據(jù)層
如上圖,使用pushEvent(object)
相當(dāng)于push("event",object)
,表示向數(shù)據(jù)層push了一個key = “event”,value = “openScreen”
和一個key = “screen-name”,value = “test page”
的map對象集。這些數(shù)據(jù)層變量會映射到Google Analytiecs中成為觸發(fā)的參數(shù)。
下面來演示一下Google Tagmanager的具體操作步驟
創(chuàng)建變量
創(chuàng)建數(shù)據(jù)層變量screen-name,作為傳入數(shù)據(jù)層map的key,命名必須跟項(xiàng)目代碼中保持一致性,注意上面的screen name2只是用于管理界面操作的標(biāo)示。
創(chuàng)建一個常量類型的變量,用于保存Google Analytiecs的tracking id
創(chuàng)建觸發(fā)器
-
觸發(fā)器openScreen: 在管理界面Event中數(shù)據(jù)層變量event值等于openScreen時觸發(fā)
-
觸發(fā)器TestScrenn: 管理界面變量screen name2中的數(shù)據(jù)層變量screen-name值等于test page時觸發(fā)
創(chuàng)建代碼Tag
先看看需要配置的的整體效果
選擇管理代碼的產(chǎn)品類型,這里選擇Google Analytiecs,擇好后再配置tag相關(guān)信息,比如GA所需的tracking id,觸發(fā)的事件類型為App View,觸發(fā)GA統(tǒng)計(jì)方法時傳入的參數(shù)screenName會替換成數(shù)據(jù)層變量screen name2的值。就是數(shù)據(jù)層變量的值映射到GA的方法參數(shù)。
借助tagmanager中的自動事件跟蹤功能,無需在調(diào)用ga的send("event", "category", "action", "label")
硬編碼每個點(diǎn)擊操作,可以直接在TagManager界面中創(chuàng)建事件代碼,然后基于預(yù)定義的變量或可以在TagManager界面中創(chuàng)建的自定義變量使用觸發(fā)器觸發(fā)這些代碼。
配置代碼觸發(fā)器,選擇之前配置的兩個觸發(fā)器就行。
全部配置完成后點(diǎn)擊保存完成,點(diǎn)擊publish生成新的版本發(fā)布。
整體的關(guān)系效果圖
通過調(diào)用tagmanager配置的數(shù)據(jù)層變量和方法,最終數(shù)據(jù)映射到Google analytiecs,這個過程并未在項(xiàng)目代碼中顯式的調(diào)用GA統(tǒng)計(jì)的代碼,但是數(shù)據(jù)還是會傳輸?shù)紾A.