本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
1 路徑設置
需要檢查目前是否已經使用了友盟+SDK,如果已經使用,請及時更改SDK文件路徑:
已經集成了友盟+SDK,現在需要集成QT SDK:在QT和友盟+的所有代碼最前面增加(至少早于收數域名)
[QTConfigure resetStorePath]
已經集成了QT SDK,現在需要集成友盟+SDK:在QT和友盟+的所有代碼最前面增加(至少早于收數域名)
[UMConfigure resetStorePath]
如果不按照上述的邏輯調用,則會使友盟+SDK與QT SDK共同使用一個存儲路徑,導致日志混亂。具體邏輯為:先調用的哪個SDK初始化方法,就重新設置另外一個SDK的文件路徑,比如先初始化的友盟+SDK,就調用 [QTConfigure resetStorePath];,如果是先初始化的QT SDK,就需要調用[UMConfigure.resetStorePath];
2 域名設置
接口:
/** 設置上報統計日志的主域名和備用域名。此函數必須在SDK初始化函數調用之前調用。
@param primaryDomain 傳日志的主域名收數地址,參數不能為null或者空串。例如:https://www.xxx.com
@param standbyDomain 上傳日志備用域名收數地址,參數可以為null或者空串,若此參數為空,SDK內部會自動將主域名設置為備用域名。
*/
+ (void)setCustomDomain:(NSString *)primaryDomain standbyDomain:(NSString *)standbyDomain;
參數:
參數 | 類型 | 描述 | 備注 |
primaryDomain | NSString | 主域名 | 必需設置 |
standbyDomain | NSString | 備用域名 | 可選 |
提示
此方法需要在初始化方法之前調用
示例代碼:
[QTConfigure setCustomDomain:@"您的收數服務域名" standbyDomain:nil];
3 合規初始化
3.1 初始化接口
1、合規聲明
您務必告知用戶您選擇Quick Tracking SDK服務,請在《隱私政策》中增加如下參考條款:
“我們的產品集成Quick Tracking SDK,Quick Tracking SDK需要收集您的OAID/GAID/MAC/IMEI/Android ID/IDFA/IDFV/OPENUDID/GUID/SIM卡 IMSI 信息/硬件序列號/MCC(移動國家編碼)、MNC(移動網號)以提供統計分析服務。”
2、合規初始化
為保證您的App在集成【Quick Tracking】統計SDK之后,能夠滿足工信部相關合規要求,您應確保App首次冷啟動時,在用戶閱讀您的《隱私政策》并取得用戶授權之后,才調用正式初始化函數初始化統計SDK,此時SDK才會真正采集設備信息并上報數據。反之,如果用戶不同意《隱私政策》授權,則不能調用初始化函數。
/** 初始化Quick Tracking所有組件產品
@param appKey 開發者在Quick Tracking產品中申請的appkey.
@param channel 渠道標識,可設置nil表示"App Store".
*/
+ (void)initWithAppkey:(NSString *)appKey channel:(NSString *)channel;
如果您同時使用了性能體驗SDK,并且需要單獨設置性能體驗SDK的收數域名,請通過以下接口進行初始化(v1.5.6.PX 及以上版本支持):
/** 初始化QTSDK所有組件產品
@param appKey 開發者在QuickTracking平臺官網申請的appkey.
@param channel 渠道標識,可設置nil表示"App Store".
@param pluginsTrackDomainIndepent 是否獨立設置性能體驗SDK的收數域名
*/
+ (void)initWithAppkey:(NSString *)appKey channel:(NSString *)channel shouldPluginsTrackDomainIndepent:(BOOL)pluginsTrackDomainIndepent;
一旦App獲取到《隱私政策》的用戶授權,后續的App冷啟動,開發者應該保證調用到初始化函數。
3.2 Appkey獲取
在初始化SDK時,需要填寫參數Appkey。Appkey是在Quick Tracking中代表應用的唯一ID,在創建應用時生成,其獲取或查看方法詳見文檔:應用管理。
4 日志打印
iOS中,日志模塊為獨立的插件,需要集成后才可以使用。
4.1 日志插件引入
如果您是手動引入的SDK,需要將日志插件包導入到您的工程中
1、選擇SDK功能組件并下載,解壓.zip文件得到相應組件包(例如:UMCommonLog.framework,UMCommonLog.bundle)。
2、XcodeFile —>Add Files to"Your Project",在彈出Panel選中所下載組件包->Add。(注:選中“Copy items if needed”)
4.2 日志插件初始化
1、說明和用途
設置是否在console輸出SDK的log信息。
日志庫UMCommonLog.framework需要明確初始化才能被各個業務組件使用。
UMCommonLog.bundle為資源文件,如果您是手動引入的SDK,必須將UMCommonLog.bundle加入到工程中,否則日志顯示的內容會不正確。
2、接口函數
接口:
+(void) setUpUMCommonLogManager;
示例代碼:
#import <UMCommonLog/UMCommonLogManager.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//開發者需要顯式的調用此函數,日志系統才能工作
[UMCommonLogManager setUpUMCommonLogManager];
}
4.3 開啟日志
通過QTCommon.framwork的頭文件UMConfigure.h接口API開啟日志
接口:
/** 設置是否在console輸出SDK的log信息.
@param bFlag 默認NO(不輸出log); 設置為YES, 輸出可供調試參考的log信息. 發布產品時必須設置為NO.
*/
+ (void)setLogEnabled:(BOOL)bFlag;
如果需要查看SDK初始化階段的日志,請在初始化之前設置開啟日志,建議在調用設置收數域名和初始化SDK接口之前開啟。
示例:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//開發者需要顯式的調用此函數,日志系統才能工作
[UMCommonLogManager setUpUMCommonLogManager];
[QTConfigure setLogEnabled:YES];//設置打開日志
[QTConfigure setCustomDomain:@"您的收數服務域名" standbyDomain:nil];//設置域名
[QTConfigure initWithAppkey:@"您的appkey" channel:@"App Store"];
/**
* 如果需要單獨設置APM收數域名,請通過以下接口初始化
* [QTConfigure initWithAppkey:@"您的appkey" channel:@"App Store" shouldPluginsTrackDomainIndepent:YES]; //v1.5.6.PX 及以上版本支持
*/
}
日志格式:
舉例:如果用戶傳入的AppKey為空的話,打印日志如下圖:
2018-02-08 20:19:44: 指當前的打印的時間;
UMengCommon: 指組件化SDK(UMCommon.framework)的名字;
<1.4.3>: 指組件化SDK(UMCommon.framework)的版本號;
(Error)[CIE10001]: 指日志的FAQ的代號,也可通過FAQ文檔找到對應的解決方法;
用戶傳入的AppKey不合法,請到官網申請AppKey,以免影響自己App的統計數據。: 指提示開發者的錯誤信息,幫助開發者找到錯誤原因。
5 數據自定義加密
自定義編解碼接口函數:
SDK端不直接參與開發者自定義的加解密算法具體實現,SDK提供委托代理QTCryptoProviderDelegate,由開發者自行實現此接口中的如下兩個方法。
@protocol QTCryptoProviderDelegate <NSObject>
- (NSData *)encode:(NSMutableDictionary<NSString *,NSString *> *)header input:(NSData *)input;
- (NSData *)decode:(NSDictionary<NSString *,NSString *> *)header input:(NSData *)input;
@end
接口方法 | 參數說明 |
- (NSData *)encode:(NSMutableDictionary<NSString *,NSString *> *)header input:(NSData *)input; | 參數: header: 需要傳遞給解密端的額外信息(如:使用的加密算法,加密模式等等任何信息)。 以多個字符串K-V鍵值對的形式傳入。SDK會將此字典中所有K-V鍵值對參數內容做base64編碼后作為http header字段dc-args傳遞給收數服務端。 收數服務端會將此字典參數原封不動傳給對應解密方法。 input: 待加密原始數據。 返回值:加密后數據。 |
- (NSData *)decode:(NSDictionary<NSString *,NSString *> *)header input:(NSData *)input; | 參數: header: 由加密方傳入的加密額外信息,解密實現方需要通過這些信息決定解密算法,模式等細節。 input: 待解密原始數據。 返回值:解密后數據。 |
自定義編解碼接口注冊函數:
[QTConfigure registerCryptoProvider:self];
接口方法 | 參數說明 |
+ (void)registerCryptoProvider:(id<QTCryptoProviderDelegate>)delegate; | 參數: delegate: 實現委托代理方法的對象。 |
示例代碼:
#import <QTCommon/UMCommon.h>
@interface AppDelegate ()<QTCryptoProviderDelegate>
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[QTConfigure setCustomDomain:@"您的收數服務域名" standbyDomain:nil];
[QTConfigure registerCryptoProvider:self];
[QTConfigure initWithAppkey:@"您的appkey" channel:@"您的渠道"];
....
return YES;
}
- (NSData *)encode:(NSMutableDictionary<NSString *,NSString *> *)header input:(NSData *)input{
//示例
[header setObject:@"value1" forKey:@"arg1"];
[header setObject:@"value2" forKey:@"arg2"];
return [self customEncode:input key:CryptoKey];
}
- (NSData *)decode:(NSDictionary<NSString *,NSString *> *)header input:(NSData *)input{
//示例
NSLog(@"decode header:%@",header);
return [self customDecode:input key:CryptoKey];
}
// 自定義加密
- (NSData *)customEncode:(NSData *)data key:(NSString *)key
{
// 自定義加密實現
}
// 自定義解密
- (NSData *)customDecode:(NSData *)data key:(NSString *)key
{
// 自定義解密實現
}