概述
跟蹤代碼管理器是一個代碼管理系統(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時,可以做到項目代碼不改變(在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ù)層就是維持了一個事件隊列嘹叫,開發(fā)者通過push一個包含key-value的map對象來添加到隊列中婆殿,當(dāng)push接受到一個key=event的是對象時,將把隊列中的事件內(nèi)容提取出來罩扇,并匹配容器中觸發(fā)器規(guī)則條件婆芦,兩者相符合的即觸發(fā)相應(yīng)代碼邏輯。因此數(shù)據(jù)層包含了接收開發(fā)者push過來的事件map對象喂饥,包含了容器中配置的數(shù)據(jù)層變量信息等消约。
Google TagManager實(shí)際示例
先在項目代碼中通過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兆沙,命名必須跟項目代碼中保持一致性诚些,注意上面的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)計方法時傳入的參數(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,這個過程并未在項目代碼中顯式的調(diào)用GA統(tǒng)計的代碼虽缕,但是數(shù)據(jù)還是會傳輸?shù)紾A.