文章已發(fā)布微信公眾號(hào):知識(shí)點(diǎn)梳理:聊聊iOSSDK數(shù)據(jù)采集那點(diǎn)事兒
1. 背景
隨著互聯(lián)網(wǎng)的發(fā)展蜜葱,我們無(wú)時(shí)無(wú)刻不在主動(dòng)或被動(dòng)接收著大量的信息,早晚上下班坐公交耀石、擠地鐵牵囤,行色匆匆、各行各業(yè)的精英分子都不忘打開(kāi)手機(jī)瀏覽新聞動(dòng)態(tài)滞伟,追看喜愛(ài)的電影揭鳞、電視劇,網(wǎng)上購(gòu)物梆奈,瀏覽各種訂閱號(hào)野崇,打打小游戲等等,當(dāng)然還有些同學(xué)閱讀紙質(zhì)書(shū)籍或使用kindle閱讀鉴裹。
通過(guò)上面的觀察可以發(fā)現(xiàn)舞骆,移動(dòng)電子設(shè)備占用了我們大量的時(shí)間钥弯,不論購(gòu)物径荔、吃飯、出行脆霎、租賃等等总处,而移動(dòng)設(shè)備主要通過(guò)App來(lái)操作,比如購(gòu)物會(huì)使用淘寶睛蛛、京東等鹦马,出行會(huì)使用滴滴、摩拜忆肾,美食會(huì)使用餓了么荸频、美團(tuán)等。
那么為了更好為自己的用戶提供更優(yōu)質(zhì)客冈、更加人性化的服務(wù)旭从,企業(yè)或公司往往都會(huì)采集用戶的一些信息,以便以后簡(jiǎn)化用戶操作或方便營(yíng)銷等。比如記錄登錄用戶經(jīng)常購(gòu)買(mǎi)某個(gè)品牌的化妝品和悦,購(gòu)買(mǎi)價(jià)格通常在300-500元區(qū)間退疫,那么企業(yè)可能會(huì)將該品牌在這個(gè)區(qū)間的化妝品放到App最明顯的位置;還比如公司做活動(dòng)鸽素,但由于活動(dòng)頁(yè)面比較深褒繁,導(dǎo)致用戶很難發(fā)現(xiàn),因此觸發(fā)次數(shù)特別少馍忽,沒(méi)有起到營(yíng)銷效果棒坏,那么企業(yè)可能就會(huì)根據(jù)采集回的數(shù)據(jù)信息進(jìn)行實(shí)時(shí)調(diào)整,將該模塊放到明顯位置遭笋、或減少操作路徑等等俊抵。
SDK數(shù)據(jù)采集的作用就在于此,既能方便用戶操作坐梯,又能起到幫助企業(yè)自我調(diào)整的作用徽诲。
2. SDK 具備的“素質(zhì)”
上圖為一款SDK本身及所采集數(shù)據(jù)需要具備的一些基本“素質(zhì)”,下面將對(duì)每個(gè)模塊逐一介紹吵血。
2.1 SDK 本身具備的“素質(zhì)”
2.1.1 穩(wěn)定性
作為App重要的組成部分盐肃,穩(wěn)定性是SDK的重中之重语卤,因?yàn)橐豢頢DK可能會(huì)被多個(gè)App使用,而每個(gè)App又有N個(gè)用戶在使用,如果某行代碼出現(xiàn)crash儒搭,后果將可想而知。
對(duì)于可能出現(xiàn)crash的代碼適當(dāng)添加try catch
進(jìn)行異常捕獲凝危,對(duì)于常用的NSMutableDictionary
/NSMutableArray
等控件在插入或訪問(wèn)時(shí)經(jīng)常出現(xiàn)數(shù)組越界军俊、nil
數(shù)據(jù)插入等,可使用Category
添加自定義安全方法褒傅,也可以在Category
中使用方法交換弃锐,先調(diào)用自定義方法進(jìn)行數(shù)據(jù)校驗(yàn),校驗(yàn)無(wú)誤再執(zhí)行系統(tǒng)方法殿托。
-
try catch
異常捕獲
image.png Category
方法交換
2.1.2 安全性
安全性目前主要使用代碼混淆方式霹菊,為防止他人通過(guò)class-dump
(下載后將文件復(fù)制到/usr/local/bin目錄下)反編譯后,根據(jù)源代碼中的方法名就可以推斷出其功能支竹。
- 特定標(biāo)識(shí)方法混淆
對(duì)工程中所有方法使用特定標(biāo)識(shí)開(kāi)頭旋廷,將所有帶有標(biāo)識(shí)的方法都使用隨機(jī)生成字符串方式替換。具體使用方式可參考:HSKConfuse
運(yùn)行程序后礼搁,找到工程 Products -> Show in Finder -->顯示包內(nèi)容 找到工程執(zhí)行文件饶碘,使用以下命令反編譯文件:
class-dump -H 執(zhí)行文件路徑 -o 導(dǎo)出的.h文件存放文件夾路徑
可發(fā)現(xiàn)反編譯后的.h文件的方法名稱已被混淆。
2.1.3 易用性
易用性主要是指用戶在使用時(shí)只需要部分代碼即可完成相應(yīng)功能馒吴。
易觀SDK對(duì)外提供了頁(yè)面自動(dòng)跟蹤功能扎运、頁(yè)面自定義采集卑雁、事件采集、通用屬性配置绪囱、用戶屬性测蹲、消息推送跟蹤及Hybrid混合頁(yè)面等模塊化的接口,用戶可根據(jù)需要自行選擇鬼吵,并且接口均為類方法扣甲,可以簡(jiǎn)便的調(diào)用。同時(shí)還提供了React Native
齿椅、Weex
琉挖、PhoneGap
三個(gè)跨平臺(tái)移動(dòng)應(yīng)用開(kāi)發(fā)框架的接口文件,開(kāi)發(fā)者無(wú)需再次進(jìn)行封裝涣脚。
2.1.4 擴(kuò)展性
對(duì)于程序來(lái)講擴(kuò)展性無(wú)疑非常重要示辈,不能因某個(gè)小小需求的改變而導(dǎo)致代碼重構(gòu),不僅浪費(fèi)人力遣蚀、物力矾麻,更重要的浪費(fèi)了時(shí)間,而時(shí)間可能導(dǎo)致商機(jī)的流失芭梯。
在易觀SDK初始化方法中使用了配置類险耀,可以方便的擴(kuò)展未知的配置信息:
為了方便用戶對(duì)自定義信息的擴(kuò)展,部分接口也預(yù)留了自定義信息玖喘,如購(gòu)買(mǎi)商品時(shí)后期可能需要分析品牌甩牺、價(jià)格、購(gòu)買(mǎi)時(shí)間段等累奈,那么開(kāi)發(fā)者可通過(guò)track:properties:
方法將數(shù)據(jù)放到properties
字典中贬派。
2.2 數(shù)據(jù)應(yīng)具備的“素質(zhì)”
2.2.1 準(zhǔn)確性
數(shù)據(jù)采集的準(zhǔn)確性是為后續(xù)數(shù)據(jù)的處理提供基礎(chǔ)保障。
其中可能需要用戶參與澎媒,傳入明確需要計(jì)算或統(tǒng)計(jì)的指標(biāo)以對(duì)其進(jìn)行精準(zhǔn)分析搞乏;為保證數(shù)據(jù)及時(shí)上傳到服務(wù)器,數(shù)據(jù)上傳至少觸發(fā)一次旱幼,若發(fā)生網(wǎng)絡(luò)中斷查描、服務(wù)器無(wú)響應(yīng)等特殊情況突委,SDK需要建立起重試機(jī)制柏卤,保證數(shù)據(jù)準(zhǔn)確送達(dá);由于數(shù)據(jù)產(chǎn)生先后順序會(huì)影響前端的展現(xiàn)和分析匀油,因此在SDK中我們會(huì)使用數(shù)據(jù)處理串行隊(duì)列及網(wǎng)絡(luò)上傳隊(duì)列缘缚,確保數(shù)據(jù)先觸發(fā)先到達(dá)。
2.2.2 安全性
數(shù)據(jù)安全性主要體現(xiàn)在存儲(chǔ)和網(wǎng)絡(luò)傳輸過(guò)程中敌蚜。
SDK采集的數(shù)據(jù)將首先存儲(chǔ)到本地?cái)?shù)據(jù)庫(kù)中桥滨,為了防止用戶篡改數(shù)據(jù),需要對(duì)數(shù)據(jù)進(jìn)行保護(hù);為了增加數(shù)據(jù)的安全性齐媒,在數(shù)據(jù)上傳時(shí)需要對(duì)數(shù)據(jù)進(jìn)行加密處理蒲每,常用的加密方式有:Base64加密、MD5加密喻括、AES加密邀杏、RSA加密等。目前易觀SDK使用前三種結(jié)合的方式對(duì)數(shù)據(jù)進(jìn)行了加密唬血,每次上傳的數(shù)據(jù)都會(huì)根據(jù)一定的算法產(chǎn)生不同的加密key望蜡,以保證數(shù)據(jù)的安全性。
2.2.3 合法性
作為數(shù)據(jù)采集模塊拷恨,每天都會(huì)有大量數(shù)據(jù)上傳服務(wù)端脖律,其中必然有部分?jǐn)?shù)據(jù)是不合法的,比如某些頁(yè)面無(wú)網(wǎng)絡(luò)狀態(tài)下無(wú)法獲取商品信息腕侄,由于疏忽導(dǎo)致購(gòu)買(mǎi)按鈕可能觸發(fā)小泉,但數(shù)據(jù)信息無(wú)法獲取,導(dǎo)致調(diào)用SDK的數(shù)據(jù)為無(wú)效數(shù)據(jù)冕杠,這些數(shù)據(jù)可以稱為“垃圾數(shù)據(jù)”膏孟,不僅對(duì)后期分析無(wú)用,還會(huì)增加清洗數(shù)據(jù)的時(shí)間拌汇,浪費(fèi)了磁盤(pán)空間柒桑。
因此SDK中單獨(dú)抽出校驗(yàn)層,對(duì)數(shù)據(jù)進(jìn)行合法性校驗(yàn)噪舀。如:SDK本身預(yù)定義一部分保留字段魁淳,$platform
(iOS
/Android
/java
等)、$lib_version
(SDK版本號(hào))与倡、$debug
(debug/release)等界逛,為防止用戶覆蓋,也是為了后期數(shù)據(jù)分析時(shí)更明確纺座、更具有針對(duì)性息拜,對(duì)傳入?yún)?shù)進(jìn)行校驗(yàn);常用的字符串長(zhǎng)度校驗(yàn)净响,防止輸入字符串過(guò)長(zhǎng)少欺;自定義屬性多層嵌套校驗(yàn),層次嵌套過(guò)多可能導(dǎo)致分析效率下降馋贤,增加復(fù)雜性赞别;屬性總個(gè)數(shù)校驗(yàn)等等。
2.2.4 可控性
作為SDK更新頻率可能沒(méi)有App那么高配乓,所以對(duì)SDK需要一定的策略控制仿滔。我們?cè)赟DK中加入了策略控制模塊惠毁,優(yōu)先級(jí)從高到低依次為:服務(wù)器策略>用戶設(shè)置策略>默認(rèn)策略。
對(duì)正在使用的SDK主要采取服務(wù)器控制策略崎页,比如:服務(wù)器端可以控制數(shù)據(jù)上傳累積條數(shù)及數(shù)據(jù)上傳間隔時(shí)間鞠绰;延遲一段時(shí)間后SDK再進(jìn)行數(shù)據(jù)上傳;更改數(shù)據(jù)上傳服務(wù)器地址飒焦;數(shù)據(jù)上傳失敗后的重試次數(shù)以及達(dá)到最大次數(shù)后下次數(shù)據(jù)上傳的時(shí)間等等洞豁,都可進(jìn)行靈活控制。
3. 總結(jié)
由于SDK模塊很少涉及UI部分荒给,所以基本結(jié)構(gòu)如下如所示: