本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
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
{
// 自定义解密实现
}