每日最新頭條.有趣資訊

知識點梳理:聊聊iOS SDK數據采集那點事兒

導讀

通過上面的觀察可以發現,移動電子設備佔用了我們大量的時間,不論購物、吃飯、出行、租賃等等,而移動設備主要通過App來操作,比如購物會使用淘寶、京東等,出行會使用滴滴、摩拜,美食會使用餓了麽、美團等。

那麽為了更好為自己的用戶提供更優質、更人性化的服務,企業或公司往往都會采集用戶的一些資訊,以便以後簡化用戶操作或方便行銷等。比如記錄登錄用戶經常購買某個品牌的化妝品,購買價格通常在300-500元區間,那麽企業可能會將該品牌在這個區間的化妝品放到App最明顯的位置;還比如公司做活動,但由於活動頁面比較深,導致用戶很難發現,因此觸發次數特別少,沒有起到行銷效果,那麽企業可能就會根據采集回的數據資訊進行實時調整,將該模塊放到明顯位置、或減少操作路徑等等。

SDK數據采集的作用就在於此,既能方便用戶操作,又能起到幫助企業自我調整的作用。

一、SDK 具備的“素質”

上圖為一款SDK本身及所采集數據需要具備的一些基本“素質”,下面將對每個模塊逐一介紹。

(一)SDK 本身具備的“素質”

1. 穩定性

作為App重要的組成部分,穩定性是SDK的重中之重,因為一款SDK可能會被多個App使用,而每個App又有N個用戶在使用,如果某行代碼出現crash,後果將可想而知。

對於可能出現crash的代碼適當添加try catch進行異常捕獲,對於常用的NSMutableDictionary/NSMutableArray等控件在插入或訪問時經常出現陣列越界、nil數據插入等,可使用Category添加自定義安全方法,也可以在Category中使用方法交換,先調用自定義方法進行數據校驗,校驗無誤再執行系統方法。

? try catch異常捕獲

? Category方法交換

2. 安全性

安全性目前主要使用代碼混淆方式,為防止他人通過class-dump(相關鏈接,請詳見文末!下載後將檔案複製到/usr/local/bin目錄下)反編譯後,根據源代碼中的方法名就可以推斷出其功能。

特定標識方法混淆對工程中所有方法使用特定標識開頭,將所有帶有標識的方法都使用隨機生成字元串方式替換。具體使用方式可參考:HSKConfuse(相關鏈接,請詳見文末!)

運行程式後,找到工程Products -> Show in Finder -->顯示包內容 找到工程執行檔案,使用以下命令反編譯檔案:

class-dump -H 執行檔案路徑-o 導出的.h檔案存放檔案夾路徑

可發現反編譯後的.h檔案的方法名稱已被混淆。

3. 易用性

易用性主要是指用戶在使用時只需要部分代碼即可完成相應功能。

易觀SDK對外提供了頁面自動跟蹤功能、頁面自定義采集、事件采集、通用屬性配置、用戶屬性、消息推送跟蹤及Hybrid混合頁面等模塊化的接口,用戶可根據需要自行選擇,並且接口均為類方法,可以簡便的調用。同時還提供了React Native、Weex、PhoneGap三個跨平台移動應用開發框架的接口檔案,開發者無需再次進行封裝。

4. 擴展性

對於程式來講擴展性無疑非常重要,不能因某個小小需求的改變而導致代碼重構,不僅浪費人力、物力,更重要的浪費了時間,而時間可能導致商機的流失。

在易觀SDK初始化方法中使用了配置類,可以方便的擴展未知的配置資訊:

為了方便用戶對自定義資訊的擴展,部分接口也預留了自定義資訊,如購買商品時後期可能需要分析品牌、價格、購買時間段等,那麽開發者可通過track:properties:方法將數據放到properties字典中。

(二) 數據應具備的“素質”

1. 準確性

數據采集的準確性是為後續數據的處理提供基礎保障。

其中可能需要用戶參與,傳入明確需要計算或統計的指標以對其進行精準分析;為保證數據及時上傳到伺服器,數據上傳至少觸發一次,若發生網絡中斷、伺服器無響應等特殊情況,SDK需要建立起重試機制,保證數據準確送達;由於數據產生先後順序會影響前端的展現和分析,因此在SDK中我們會使用數據處理串行隊列及網絡上傳隊列,確保數據先觸發先到達。

2. 安全性

數據安全性主要體現在存儲和網絡傳輸過程中。

SDK采集的數據將首先存儲到本地數據庫中,為了防止用戶篡改數據,需要對數據進行保護;為了增加數據的安全性,在數據上傳時需要對數據進行加密處理,常用的加密方式有:Base64加密、MD5加密、AES加密、RSA加密等。目前易觀SDK使用前三種結合的方式對數據進行了加密,每次上傳的數據都會根據一定的算法產生不同的加密key,以保證數據的安全性。

3. 合法性

作為數據采集模塊,每天都會有大量數據上傳服務端,其中必然有部分數據是不合法的,比如某些頁面無網絡狀態下無法獲取商品資訊,由於疏忽導致購買按鈕可能觸發,但數據資訊無法獲取,導致調用SDK的數據為無效數據,這些數據可以稱為“垃圾數據”,不僅對後期分析無用,還會增加清洗數據的時間,浪費了磁盤太空。

因此SDK中單獨抽出校驗層,對數據進行合法性校驗。如:SDK本身預定義一部分保留資料欄,$platform(iOS/Android/java等)、$lib_version(SDK版本號)、$debug(debug/release)等,為防止用戶覆蓋,也是為了後期數據分析時更明確、更具有針對性,對傳入參數進行校驗;常用的字元串長度校驗,防止輸入字元串過長;自定義屬性多層嵌套校驗,層次嵌套過多可能導致分析效率下降,增加複雜性;屬性總個數校驗等等。

4. 可控性

作為SDK更新頻率可能沒有App那麽高,所以對SDK需要一定的策略控制。我們在SDK中加入了策略控制模塊,優先級從高到低依次為:伺服器策略>用戶設定策略>默認策略。

對正在使用的SDK主要采取伺服器控制策略,比如:伺服器端可以控制數據上傳累積條數及數據上傳間隔時間;延遲一段時間後SDK再進行數據上傳;更改數據上傳伺服器地址;數據上傳失敗後的重試次數以及達到最大次數後下次數據上傳的時間等等,都可進行靈活控制。

二、總結

由於SDK模塊很少涉及UI部分,所以基本結構如下圖所示:

class-dump??

http://stevenygard.com/projects/class-dump/

HSKConfuse??

https://github.com/housenkui/HSKConfuse

2018易觀A10峰會

單日票新鮮出爐

26日通票279元

27日通票209元

隨心組合

共享年度大數據巔峰盛典

獲得更多的PTT最新消息
按讚加入粉絲團