Mobile Analytics iOS SDK開發指南
1. 前言
本文檔介紹了移動數據分析(Mobile Analytics) iOS SDK的使用方式。
Mobile Analytics iOS SDK是阿里云面向移動開發者提供的iOS平臺下的數據統計與監控服務。通過該SDK,開發者可以在自己的APP中便捷地進行數據埋點,監控日常的業務數據與性能數據,并通過阿里云控制臺界面觀察對應的數據報表展現。另外,用戶可以通過設定自定義的數據解析規則實現定制化的數據圖表展現。
您可以通過獲取alicloud-ios-demo工程源碼獲得移動數據分析服務的使用例程。
2. 安裝Mobile Analytics iOS SDK
2.1 注意
使用
1.0.7
及之前版本請在【Crash分析】板塊查看crash信息。使用
1.0.8
版本及之后的版本,請在【新版Crash分析】板塊查看crash信息。推薦使用1.0.8
及之后的版本,crash數據更加準確,丟包率更小。刪除
- (ALBBMANTracker *)getTracker:(NSString) trackerId
方法,請使用- (ALBBMANTracker *)getDefaultTracker
代替。刪除
- (void)setCrashCaughtListener:(id<ALBBMANICrashCaughtListener>)aListener
方法,1.0.8
及之后的版本使用新的crash模塊,無需再調用此方法設置參數。
2.2 手動集成SDK
將下載的包加至Link Binary With Libraries,包括:
AlicloudMobileAnalytics.framework
UTMini.framework
UTDID.framework
CrashReporter.framework
注意:因移動數據分析依賴 CrashReporter.framework,如果同時使用崩潰分析,必須把 pod 'AlicloudMAN' 改為 pod 'AlicloudMANLight' 才能解決依賴沖突。
加載系統必須依賴的包:
libz.tbd
libresolv.tbd
libsqlite3.tbd
CoreTelephony.framework
SystemConfiguration.framework
2.3 Pod集成
指定Master倉庫和阿里云倉庫:
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/aliyun/aliyun-specs.git'
添加依賴:
pod 'AlicloudMAN', '~> 1.0.12'
pod 'AlicloudUT', '~> 5.2.0.8'
(~>為模糊指定版本號方式,~> 1.0.12表明引用版本位于1.0.12 <= version < 1.1
之間的最新版本SDK,用戶可參考Podfile Syntax Reference,根據項目需要指定SDK版本。)
注意:因移動數據分析依賴 CrashReporter.framework,如果同時使用崩潰分析,必須把 pod ‘AlicloudMAN’ 改為 pod ‘AlicloudMANLight’ 才能解決依賴沖突。
2.4 下載SDK統一配置文件
在控制臺產品概覽頁面,下載App的配置文件
AliyunEmasServices-Info.plist
,如下圖所示:Xcode中,把下載的
AliyunEmasServices-Info.plist
文件拖入對應App Target下即可,在彈出框勾選Copy items if needed
。【附】
AliyunEmasServices-Info.plist
配置文件,包含SDK初始化所需的配置信息,用戶只需要調用無需手動輸入配置信息的autoInit
初始化接口,參考第3節描述。
2.5 引用頭文件
#import <AlicloudMobileAnalitics/ALBBMAN.h>
特別說明:應用的targets->Build Settings->linking->Other Linker Flags,請加上-ObjC這個屬性。
3. 獲取Mobile Analytics服務
在您使用Mobile Analytics iOS SDK進行數據統計與監控前,您需要首先獲取Mobile Analytics服務,然后可以進行版本和渠道的配置。
手動輸入配置信息,初始化接口:
- (void)initWithAppKey:(NSString *)appKey secretKey:(NSString *)secretKey;
自動初始化接口:
- (void)autoInit;
MAN SDK初始化實例:
// 獲取MAN服務
ALBBMANAnalytics *man = [ALBBMANAnalytics getInstance];
// 打開調試日志,線上版本建議關閉
// [man turnOnDebug];
// 初始化MAN,無需輸入配置信息
[man autoInit];
// appVersion默認從Info.list的CFBundleShortVersionString字段獲取,如果沒有指定,可在此調用setAppversion設定
// 如果上述兩個地方都沒有設定,appVersion為"-"
[man setAppVersion:@"2.3.1"];
// 設置渠道(用以標記該app的分發渠道名稱),如果不關心可以不設置即不調用該接口,渠道設置將影響控制臺【渠道分析】欄目的報表展現。
[man setChannel:@"50"];
4. 業務數據統計
數據統計的準確性依賴被監控APP的常規生命軌跡,比如應用啟動次數依賴于用戶正常退出應用觸發的上報策略。
4.1 登錄/注冊會員
4.1.1 登錄會員
接口:
- (void)updateUserAccount:(NSString *)pNick userid:(NSString *)pUserId;
功能:獲取登錄會員,然后會給每條日志添加登錄會員字段
是否必須調用:否
調用時機:登錄時調用
備注:阿里云平臺上的登錄會員 UV 指標依賴該接口
4.1.2 注冊會員
接口:
- (void)userRegister:(NSString *)pUsernick;
功能:產生一條注冊會員事件日志
是否必須調用:否
調用時機:注冊時調用
備注:阿里云平臺上注冊會員指標依賴該接口
4.1.3 代碼示例
ALBBMANAnalytics *man = [ALBBMANAnalytics getInstance];
[man userRegister:@"userNick"];
[man updateUserAccount:@"userNick" userid:@"userId"];
完成上述埋點后,您就可以在阿里云控制臺看到相應統計信息,例如下圖顯示實時統計里的登錄會員和新注冊會員。
4.2 頁面埋點
使用ALBBMANPageHitHelper可以進行ViewController級別的頁面埋點,ALBBMANPageHitHelper為頁面埋點輔助類,可以自動完成頁面名稱(默認獲取ViewController名稱并去除后綴Controller
)、來源頁面和頁面停留時間的統計,如需使用更為靈活的頁面埋點方案,可使用ALBBMANPageHitBuilder
頁面打點基礎類進行頁面埋點,詳情見4.3節。
【注意】:如果App中沒有進行頁面埋點,活躍用戶
參數不能正常統計。
4.2.1 頁面進入
接口:
- (void)pageAppear:(UIViewController *)pViewController;
功能:記錄頁面進入時的一些狀態信息,但不發送日志,和 pageDisappear 配合使用
入參:UIViewController 或者其子類指針
是否必須調用:需要對頁面埋點時調用
調用時機:viewDidAppear
備注:必須和 pageDisappear 搭配使用
4.2.2 頁面離開
接口:
- (void)pageDisAppear:(UIViewController *)pViewController;
功能: 頁面離開發送頁面事件日志,和 pageAppear 配合使用
入參: UIViewController 或者其子類指針
是否必須調用: 當調用了 pageAppear 后,必須調用 pageDisappear
調用時機: viewDidDisAppear
備注: 必須和 pageAppear 搭配使用
4.2.3 設置頁面擴展參數
接口:
- (void)updatePageProperties:(UIViewController *)pViewController properties:(NSDictionary *)pProperties;
功能:設置頁面擴展參數
是否必須調用:否
調用時機:調用pageDisAppear之前
4.2.4 代碼示例
// 進入頁面
[[ALBBMANPageHitHelper getInstance] pageAppear:self];
// 設置頁面事件擴展參數
NSDictionary *properties = [NSDictionary dictionaryWithObject:@"pageValue" forKey:@"pageKey"];
[[ALBBMANPageHitHelper getInstance] updatePageProperties:self properties:properties];
// 離開頁面
[[ALBBMANPageHitHelper getInstance] pageDisAppear:self];
4.3 頁面事件
ALBBMANPageHitBuilder 類也是用來產生頁面事件日志的,雖然 4.2 節中可以通過 pageAppear 和 pageDisAppear 來進行頁面埋點,但是它針對的只是 UIViewController 級別的頁面,并不能滿足一些場景的頁面事件,例如 UIView,如果用戶需要將一個UIView 當做一個頁面,那么就可以通過 ALBBMANPageHitBuilder 來進行頁面事件的埋點,即用戶自己采集頁面事件相關的信息(如頁面的 refer、頁面停留時間等),通過 ALBBMANPageBuilder 構造出一條頁面事件的日志 map,最后通過某個 ALBBMANTracker 埋點實例的 send API發送上傳。
ALBBMANTracker是一個用于對埋點數據進行上報的工具,下文提到的ALBBMANPageHitBuilder等事件類都是通過ALBBMANTracker進行事件上報的。其中ALBBMANTracker的獲取如下所示:
// 獲取默認ALBBMANTracker實例
ALBBMANTracker *tracker = [[ALBBMANAnalytics getInstance] getDefaultTracker];
埋點數據上報都是通過ALBBMANTracker進行,我們可以設定/刪除上報數據的全局字段,全局字段設定后在所有的上報日志中都可以查看,如下所示:
ALBBMANTracker *tracker = [[ALBBMANAnalytics getInstance] getDefaultTracker];
// 設定全局字段
[tracker setGlobalProperty:@"globalKey1" value:@"globalValue1"];
// 刪除全局字段
[tracker removeGlobalProperty:@"globalKey1"];
4.3.1 設置頁面名稱
接口:
- (void)setPageName:(NSString *)pPageName;
功能: 設置頁面名稱
入參: 頁面名稱,pPageName不能為空
是否必須調用: 是,在已經創建了 ALBBMANPageHitBuilder 實例后,必須調用該方法
調用時機: 創建 ALBBMANPageHitBuilder 后,必須調用 setPageName,否則調用 build 后返回為 nil
備注: 頁面名稱是頁面事件的基礎,必須設置
4.3.2 設置頁面 refer
接口:
- (void)setReferPage:(NSString *)pReferPageName;
功能: 設置頁面的 refer,即當前頁面的來源頁面
入參: refer 頁面名稱,需要在 setPageName 的 PageName 集合中,也可以為空
是否必須調用: 否
4.3.3 設置頁面停留時間
接口:
- (void)setDurationOnPage:(long long)durationTimeOnPage;
功能: 記錄頁面從展現到頁面離開的停留時間
入參: 頁面停留時間
是否必須調用:否
調用時機: 需要記錄當前頁面停留時間
4.3.4 設置頁面事件擴展參數
接口:
- (void)setProperty:(NSString *)pKey value:(NSString *)pValue;
功能:給單條日志添加一個擴展參數
入參:key 和 value 都不能為 nil,其中 key 不能為PAGE/EVENTID/ARG1/ARG2/ARG3/ARGS,否則 build 返回 nil
是否必須調用:否
調用時機:需要給ALBBMANPageHitBuilder實例添加擴展參數時
4.3.5 組裝單條日志 map
接口:
- (NSDictionary *)build;
功能: 將塞入的參數組成 map 返回
入參: 無
是否必須調用: 否
調用時機: 創建 ALBBMANPageHitBuilder 或者 ALBBMANCustomHitBuilder 實例,塞入一些業務字段后,調用 build 組裝業務字段生成日志 map,通過某個 ALBBMANTracker 埋點實例 send 接口發送
備注: build 函數返回的日志 map,必須通過ALBBMANTracker埋點上報工具的send接口上傳數據完成打點
4.3.6 代碼示例
ALBBMANPageHitBuilder *pageHitBuilder = [[ALBBMANPageHitBuilder alloc] init];
// 設置頁面refer
[pageHitBuilder setReferPage:@"pageRefer"];
// 設置頁面名稱
[pageHitBuilder setPageName:@"pageName"];
// 設置頁面停留時間
[pageHitBuilder setDurationOnPage:100];
// 設置頁面事件擴展參數
[pageHitBuilder setProperty:@"pagePropertyKey1" value:@"pagePropertyValue1"];
[pageHitBuilder setProperty:@"pagePropertyKey2" value:@"pagePropertyValue2"];
ALBBMANTracker *tracker = [[ALBBMANAnalytics getInstance] getDefaultTracker];
// 組裝日志并發送
[tracker send:[pageHitBuilder build]];
上述的頁面埋點與頁面事件將影響控制臺【頁面路徑分析】、【關鍵漏斗】、【控件點擊】、【頁面留存】等指標的報表展現,頁面路徑如下圖所示。
5. 自定義事件
自定義事件埋點可用于滿足用戶的定制化需求。
5.1 設置自定義事件的標簽
接口:
- (void)setEventLabel:(NSString *)pEventId;
功能: 區分不同自定義事件的標簽,同一種自定義事件的 pEventId 相同
入參: 自定義事件標簽,相當于自定義事件的業務 ID,不能為空,只能為字母、數字和下劃線組成
是否必須調用: 是
調用時機: 創建 ALBBMANCustomHitBuilder 后,必須調用 setEventLabel,否則調用 build 后返回為 nil
5.2 設置自定義事件的頁面名稱
接口:
- (void)setEventPage:(NSString *)pPageName;
功能: 設置該自定義事件發生在哪個頁面
入參: 自定義事件的頁面名稱,可以為空,這種情況日志中默認頁面名稱為 “UT”
是否必須調用: 否
調用時機: 需要明確該自定義事件發生時的頁面,不調用情況下默認為 “UT”
5.3 設置自定義事件停留時間
接口:
- (void)setDurationOnEvent:(long long)durationOnEvent;
功能: 設置自定義事件持續時間,跟 ALBBMANPageHitBuilder 中的頁面停留時間類似
入參: 自定義事件停留時間
是否必須調用: 否
調用時機: 需要記錄自定義事件的停留時間
5.4 設置自定義事件擴展參數
接口:
- (void)setProperty:(NSString *)pKey value:(NSString *)pValue;
功能:給單條日志添加一個擴展參數
入參:key 和 value 都不能為 nil,其中 key 不能為PAGE/EVENTID/ARG1/ARG2/ARG3/ARGS,否則 build 返回 nil
是否必須調用:否
調用時機:需要給ALBBMANCustomHitBuilder實例添加擴展參數時
5.5 代碼示例
ALBBMANCustomHitBuilder *customBuilder = [[ALBBMANCustomHitBuilder alloc] init];
// 設置自定義事件標簽
[customBuilder setEventLabel:@"test_event_label"];
// 設置自定義事件頁面名稱
[customBuilder setEventPage:@"test_Page"];
// 設置自定義事件持續時間
[customBuilder setDurationOnEvent:12345];
// 設置自定義事件擴展參數
[customBuilder setProperty:@"ckey0" value:@"value0"];
[customBuilder setProperty:@"ckey1" value:@"value1"];
[customBuilder setProperty:@"ckey2" value:@"value2"];
ALBBMANTracker *traker = [[ALBBMANAnalytics getInstance] getDefaultTracker];
// 組裝日志并發送
NSDictionary *dic = [customBuilder build];
[traker send:dic];
自定義事件擴展參數在控制臺【自定義事件】-【詳細數據】-【參數分析】中可查看,但查看之前請在【參數分析】-【自定義事件參數管理】中添加相關的參數。
6. 如何實時驗證數據是否正常上報
您當前可以通過以下兩種方式進行驗證:
打開移動數據分析log,查看是否會出現如
***** UTMCEngine <info> ***** UTMCUploader:upload :: upload response:{"t":1464532326870,"ret":"","success":"success"}
的日志;注意:SDK的日志上報會有緩存和聚合,因此上報時機會比API調用時機滯后一些,可耐心等待30-60s或將應用切到后臺查看。
登錄控制臺查看
活躍用戶
等實時報表;注意:活躍用戶的統計依賴頁面埋點,移動數據分析后臺會將零星的頁面埋點處理為噪點,進行過濾,因此請確保您有足量的頁面埋點事件上報(>5),另外控制臺的實時報表大概會有5min的延遲。
7. H5頁面數據的采集
H5頁面采集并沒有單獨的SDK,依賴native進行上傳,通過JSBridge通知給native,然后調用MAN的相應方法,進行數據的上報。可運行demo請參考:alicloud-ios-demo
7.1 代碼示例
H5進行自定義事件的上報:
JavaScript代碼:
// 通過iframe發起請求,然后在native端進行捕獲。
var iframe = document.createElement("IFRAME");
// 通過自定義scheme,來判斷是正常請求還是H5通信。
// 參數可以放在url中,然后在native解析。
iframe.setAttribute("src", "jsbridge://custom");
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null;
Objective-c
- (BOOL) webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType
{
NSURL *url = [request URL];
NSString *scheme = [url scheme];
// js通信
if ( [@"jsbridge" isEqualToString:scheme] ) {
if ( [@"custom" isEqualToString:url.host] ) {
ALBBMANCustomHitBuilder *customBuilder = [[ALBBMANCustomHitBuilder alloc] init];
// 設置自定義事件標簽
[customBuilder setEventLabel:@"test_event_label"];
// 設置自定義事件頁面名稱
[customBuilder setEventPage:@"test_Page"];
// 設置自定義事件持續時間
[customBuilder setDurationOnEvent:12345];
// 設置自定義事件擴展參數
[customBuilder setProperty:@"ckey0" value:@"value0"];
[customBuilder setProperty:@"ckey1" value:@"value1"];
[customBuilder setProperty:@"ckey2" value:@"value2"];
ALBBMANTracker *traker = [[ALBBMANAnalytics getInstance] getDefaultTracker];
// 組裝日志并發送
NSDictionary *dic = [customBuilder build];
[traker send:dic];
}
return NO;
}
return YES;
}