QT iOS 私部署集成文档。
合规指南
合规要求
1、您需要确保App有《隐私政策》,并且在用户首次启动App时就弹出《隐私政策》取得用户同意。
2、您务必告知用户您选择友盟+SDK服务,请在《隐私政策》中增加如下参考条款:
“我们的产品集成友盟+SDK,友盟+SDK需要收集您的设备Mac地址、唯一设备识别码(IMEI/android ID/IDFA/OPENUDID/GUID、SIM 卡 IMSI 信息)以提供统计分析服务,并通过地理位置校准报表数据准确性,提供基础反作弊能力。”
3、您务必确保用户同意《隐私政策》之后,再初始化友盟+SDK。具体初始化步骤详见下文。
技术实现
为保证您的App在集成【友盟+】统计SDK之后,能够满足工信部相关合规要求,您应确保App首次冷启动时,在用户阅读您的《隐私政策》并取得用户授权之后,才调用正式初始化函数初始化统计SDK,此时SDK才会真正采集设备信息并上报数据。反之,如果用户不同意《隐私政策》授权,则不能调用初始化函数。
/** 初始化友盟所有组件产品
@param appKey 开发者在友盟官网申请的appkey.
@param channel 渠道标识,可设置nil表示"App Store".
*/
+ (void)initWithAppkey:(NSString *)appKey channel:(NSString *)channel;一旦App获取到《隐私政策》的用户授权,后续的App冷启动,开发者应该保证调用到初始化函数。
创建应用
新建应用获取Appkey
「管理控制台」-「组织管理」-「管理应用」在应用列表中进行新建应用。

注:如果您已经接入了友盟+其他产品,请联系接口人,保证同一应用的appkey一致。
集成SDK
自动集成
待支持
手动集成
CoreTelephony.framework 获取运营商标识
libz.tbd 数据压缩
libsqlite.tbd 数据缓存
SystemConfiguration.framework 判断网络状态选择SDK功能组件并下载,解压.zip文件得到相应组件包(例如:UMCommon.framework等)。
Xcode
File->Add Files to " Your Project ",在弹出Panel选中所下载组件包->Add。
(注:选中“Copy items if needed”)

添加依赖库,在项目设置
target->选项卡General->Linked Frameworks and Libraries如下:

Targets->BuildSettings 中 , Other Linker Flags增加-ObjC,⼀定要添加此项,注意是⼤写C,不是⼩写c。
基础功能
初始化
接口:
/** 设置上报统计日志的主域名和备用域名。此函数必须在SDK初始化函数调用之前调用。
@param primaryDomain 传日志的主域名收数地址,参数不能为null或者空串。例如:https://www.umeng.com
@param standbyDomain 上传日志备用域名收数地址,参数可以为null或者空串,若此参数为空,SDK内部会自动将主域名设置为备用域名。
*/
+ (void)setCustomDomain:(NSString *)primaryDomain standbyDomain:(NSString *)standbyDomain;参数:
参数 | 类型 | 描述 | 备注 |
primaryDomain | NSString | 主域名 | 必需设置 |
standbyDomain | NSString | 备用域名 | 可选 |
提示
此方法需要初始化方法之前调用
接口:
/** 初始化友盟所有组件产品
@param appKey 开发者在友盟官网申请的appkey.
@param channel 渠道标识,可设置nil表示"App Store".
*/
+ (void)initWithAppkey:(NSString *)appKey channel:(NSString *)channel;参数:
参数 | 类型 | 描述 | 备注 |
appKey | NSString | 在 App Analytics 创建应用后,进入数据报表页中, 在“统计分析->设置->应用信息” 页面查看。 | AppKey为必需,为了根据您的AppKey查看后台的实时和离线统计数据,帮助您了解目前您的产品的详细情况。 |
channel | NSString | channel为您应用的推广渠道。channel为nil或@""时,默认会被当作@"App Store"渠道 | 渠道命名规范:可以由英文字母、阿拉伯数字、下划线、中划线、空格、括号组成,可以含汉字以及其他明文字符,但是不建议使用中文命名,会出现乱码。 首尾字符不可以为空格最多256个字符 "App Store" 及其各种大小写形式,作为友盟保留的字段,不可以作为渠道名。 |
示例:
#import <UMCommon/UMCommon.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[UMConfigure setCustomDomain:@"https://www.umeng.com" standbyDomain:nil];
[UMConfigure initWithAppkey:@"Your appkey" channel:@"App Store"];
}将[UMConfigure initWithAppkey:@"Your appkey"channel:@"App Store"] 中的App Store 替换为您应用的推广渠道。channelId为nil或@""时,默认会被当作@"App Store"渠道。
命名规则:
可以由英文字母、阿拉伯数字、下划线、中划线、空格、括号组成,可以含汉字以及其他明文字符,但是不建议使用中文命名,会出现乱码。
首尾字符不可以为空格
最多256个字符
"App Store"及其各种大小写形式,作为友盟保留的字段,不可以作为渠道名。
日志查看集成
1、选择SDK功能组件并下载,解压.zip文件得到相应组件包(例如:UMCommonLog.framework,UMCommonLog.bundle)。
2、XcodeFile -> Add Files to"Your Project",在弹出Panel选中所下载组件包-> Add。
(注:选中“Copy items if needed”)


1、说明和用途
设置是否在console输出SDK的log信息。
日志库UMCommonLog.framework需要明确初始化才能被各个业务组件使用。
UMCommonLog.bundle为资源文件,必须加入到工程中,否则日志显示的内容会不正确。
2、接口函数
接口:
+(void) setUpUMCommonLogManager;示例代码:
#import <UMCommonLog/UMCommonLogHeaders.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//开发者需要显式的调用此函数,日志系统才能工作
[UMCommonLogManager setUpUMCommonLogManager];
}通过UMCommon.framwork的头文件UMConfigure.h接口API开启日志
接口:
/** 设置是否在console输出SDK的log信息.
@param bFlag 默认NO(不输出log); 设置为YES, 输出可供调试参考的log信息. 发布产品时必须设置为NO.
*/
+ (void)setLogEnabled:(BOOL)bFlag;示例:
#import <UMCommon/UMCommon.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//开发者需要显式的调用此函数,日志系统才能工作
[UMCommonLogManager setUpUMCommonLogManager];
[UMConfigure setLogEnabled:YES];//设置打开日志
[UMConfigure setCustomDomain:@"https://www.umeng.com" standbyDomain:nil];//设置域名
[UMConfigure initWithAppkey:@"Your appkey" channel:@"App Store"];
}日志格式:
举例:如果用户传入的AppKey为空的话,打印日志如下图:

2018-02-08 20:19:44: 指当前的打印的时间;
UMengCommon: 指组件化SDK(UMCommon.framework)的名字;
<1.4.3>:指组件化SDK(UMCommon.framework)的版本号;
(Error): 指日志等级是Error的日志;
[CIE10001]: 指日志的FAQ的代号,也可通过FAQ文档找到对应的解决方法;
用户传入的AppKey不合法,请到官网申请AppKey,以免影响自己App的统计数据。: 指提示开发者的错误信息,帮助开发者找到错误原因。
相关说明
从组件化产品开始,【友盟+】SDK默认采集idfa标识,用来更准确的分析核对数据。对于应用本身没有获取idfa的情况,建议将应用提交至AppStore时按如下方式配置:(以避免被苹果以“应用不含广告功能,但获取了广告标示符IDFA”的而拒绝其上架。)

发送策略设定了用户产生的数据发送回【友盟+】服务器的频率。
Android平台的数据发送策略为【准实时发送】:页面PV数据、自定义事件数据支持准实时发送策略,SDK支持在PV和自定义事件触发后,延迟一段间隔时长后批量上报数据,间隔时长介于3秒-90秒之间,如果应用程序启动时处在不联网状态,那么消息将会缓存在本地,下次再尝试发送。SDK默认使用准实时发送策略,间隔时长为3秒。
高级功能
超级属性
如果用户具有某些典型特征(例如账号类型、会员级别等),或者需要按照某些特征(例如广告来源)分析用户的行为,那么可通过以下方法为用户注册特征属性。注册特征属性后,该用户后续触发的所有日志都将带有该属性。
/**
* 设置超级属性键值对会覆盖同名的key
*/
+(void) registerSuperProperty:(NSDictionary *)property;参数 | 类型 | 描述 | 备注 |
property | NSDictionary | 超级属性的属性名称和属性值 |
获取一个特定的超级属性,删除后,后续触发的所有事件都不再携带该属性。
/**
* 获取一个全局属性;如果不存在,则返回空。
*/
+(NSString *) getSuperProperty:(NSString *)propertyName;参数 | 类型 | 描述 | 备注 |
propertyName | NSString | 属性名,只支持大小写字母、数字及下划线! | |
返回值 | NSString |
删除一个特定的超级属性,删除后,后续触发的所有事件都不再携带该属性。
/**
*
* 删除指定超级属性
@param key
*/
+(void) unregisterSuperProperty:(NSString *)propertyName;参数 | 类型 | 描述 | 备注 |
propertyName | NSString | 属性名,只支持大小写字母、数字及下划线! |
/**
* 获取所有超级属性;如果不存在,则返回空。
*/
+(NSDictionary *)getSuperProperties;参数 | 类型 | 描述 | 备注 |
返回值 | NSDictionary | 返回的超级属性值类型为字符型,必须和注册此超级属性时传入参数类型一致。 |
/**
*清空所有超级属性。
*/
+(void)clearSuperProperties;全局属性
注册全局属性后,后续触发的所有事件都将自动包含这些属性;且这些属性及属性值存入缓存,APP退出后清除。在分析数据时,可根据此属性进行查看和筛选。
/**
* 设置全局属性键值对会覆盖同名的key
*/
+(void) registerGlobalProperty:(NSDictionary *)property;参数 | 类型 | 描述 | 备注 |
property | NSDictionary | 全局属性的属性名称和属性值 |
获取一个特定的全局属性,删除后,后续触发的所有事件都不再携带该属性。
/**
* 获取一个全局属性;如果不存在,则返回空。
*/
+(NSString *) getGlobalProperty:(NSString *)propertyName;参数 | 类型 | 描述 | 备注 |
propertyName | NSString | 属性名,只支持大小写字母、数字及下划线! | |
返回值 | NSString |
删除一个特定的全局属性,删除后,后续触发的所有事件都不再携带该属性。
/**
*
* 删除指定全局属性
@param key
*/
+(void) unregisterGlobalProperty:(NSString *)propertyName;参数 | 类型 | 描述 | 备注 |
propertyName | NSString | 属性名,只支持大小写字母、数字及下划线! |
/**
* 获取所有全局属性;如果不存在,则返回空。
*/
+(NSDictionary *)getGlobalProperties;参数 | 类型 | 描述 | 备注 |
返回值 | NSDictionary | 返回的全局属性值类型为字符型,必须和注册此全局属性时传入参数类型一致。 |
/**
*清空所有全局属性。
*/
+(void)clearGlobalProperties;注:超级属性和全局属性的区别在于:超级属性注册后被存入客户端文件中,APP重启也依然存在;全局属性注册后会被缓存在内存中,App进程退出后清除。
账号统计功能
【友盟+】在统计用户时以设备为标准,如果需要统计应用自身的账号,可以使用此功能
接口函数:
+ (void)profileSignInWithPUID:(NSString *)puid;
+ (void)profileSignInWithPUID:(NSString *)puid provider:(NSString *)provider;
+ (void)profileSignOff;参数:
参数 | 类型 | 描述 | 备注 |
puid | NSString | 用户ID | |
provider | NSString | 账号来源 | 不能以下划线"_"开头,使用大写字母和数字标识; 如果是上市公司,建议使用股票代码。 |
示例代码:
友盟+在统计用户时以设备为标准,若需要统计应用自身的账号,下述两种API任选其一接口:
// PUID:用户账号ID.长度小于64字节
// Provider:账号来源。不能以下划线"_"开头,使用大写字母和数字标识,长度小于32 字节 ;
[MobClick profileSignInWithPUID:@"UserID"];
[MobClick profileSignInWithPUID:@"UserID" provider:@"WB"];Signoff调用后,不再发送账号内容。
[MobClick profileSignOff];页面采集
采集模式 | 优点 | 缺点 | 说明 |
AUTO(自动) | 自动采集无需人工埋码即可默认获取className。 | 受页面嵌套形式,组件弹出等情况,会有统计不准确风险,且页面名称不可更改。 | 是否设置自动采集模式接口一个工程只能调用一次,若调用2次,第二次无效。 |
MANUAL(手动) | 可根据业务需求进行埋码,灵活性高,后台查看方便。 | 需手动操作,埋码成本较自动获取高。 | 默认采集方式 |
接口函数:
//在初始化函数前设置
+ (void)setAutoPageEnabled:(BOOL)value;示例代码:
//设置为自动采集页面
[MobClick setAutoPageEnabled:YES];若需要对某页面的页面编码进行修改,可以通过调用beginLogPageView:和endLogPageView:这组接口对该页面进行手动埋点,并使用skipMe禁止该页面的自动上报。
引入UMSPM.framework
引入头文件UMSpmHybrid.h
#import <UMSpm/UMSpmHybrid.h>调用+ (void)skipMe:(id)PageObject pageName:(NSString *)pageName;
/**
* @brief 跳过当前页面统计.
*
* @param PageObject 容器对象(自动获取页面时使用,默认手动可填nil)
* @param pageName 页面名称(手动设置页面时使用,当设置自动获取页面时可填nil)
* @warning 建议在设置页面之前调用此接口,调用后设置的native页面将不发送数据
*
*/
+ (void)skipMe:(id)PageObject pageName:(NSString *)pageName;建议在viewDidAppear最开始调用,如只不统计当前自动页面,可以将pageName参数设置成nil。例:
- (void)viewDidAppear:(BOOL)animated
{
//不统计当前class自动页面
[UMSpmHybrid skipMe:[self class] pageName:nil ];
[super viewDidAppear:animated];
[MobClick beginLogPageView:@"PageHome"];
}接口函数:
+ (void)logPageView:(NSString *)pageName seconds:(int)seconds;
+ (void)beginLogPageView:(NSString *)pageName;
+ (void)endLogPageView:(NSString *)pageName;参数:
参数 | 类型 | 描述 | 备注 |
pageName | NSString | 统计的页面名称 | |
seconds | int | 时长 | 单位为秒 |
注意:
必须配对调用beginLogPageView:和endLogPageView:两个函数来完成自动统计,若只调用某一个函数不会生成有效数据;
在该页面展示时调用beginLogPageView:,当退出该页面时调用endLogPageView:。
示例代码:
在ViewController类的viewWillAppear: 和 viewWillDisappear:中配对调用如下方法:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[MobClick beginLogPageView:@"Pagename"]; //("Pagename"为页面名称,可自定义)
}- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[MobClick endLogPageView:@"Pagename"];
}您也可以根据您自己的业务场景,在viewDidAppear:和viewDidDisappear:等方法中配对调用beginLogPageView:和endLogPageView:两个函数来完成自动统计。
自定义事件
自定义事件可以用于追踪用户行为,记录行为发生的具体细节。
接口:
+ (void)event:(NSString *)eventId;
+ (void)event:(NSString *)eventId label:(NSString *)label;
+ (void)event:(NSString *)eventId attributes:(NSDictionary *)attributes;
+ (void)event:(NSString *)eventId attributes:(NSDictionary *)attributes counter:(int)number;参数说明:
参数 | 类型 | 描述 | 备注 |
eventId | NSString | 网站上注册的事件Id | 无 |
label | NSString | 分类标签 | 不同的标签会分别进行统计,方便同一事件的不同标签的对比,为nil或空字符串时后台会生成和eventId同名的标签。 |
attributes | NSDictionary | 自定义属性 | 属性中的key-value必须为String类型, 每个应用至多添加500个自定义事件,key不能超过100个。 |
counter | int | 自定义数值 | 无 |
示例1:
统计微博应用中”转发”事件发生的次数,那么在转发的函数里调用:
复制代码到剪切板
[MobClick event:@"Forward"];示例2:
统计电商应用中“购买”事件发生的次数,以及购买的商品类型及数量,那么在购买的函数里调用:
复制代码到剪切板
NSDictionary *dict = @{@"type" : @"book", @"quantity" : @"3"};
[MobClick event:@"purchase" attributes:dict];event ID:自定义事件ID,指一个操作 例如:您可定义“pause”或“play”作为一个事件。您也可更加具体,创建一个“music_willbe_finished”的事件,并设定在音乐播放了 90% 的那一刻触发;友盟+提供了两种自定义事件的形式:
多参数类型事件
和
计算事件
。
key:自定义事件下的参数,一个可选的描述符,用于定义事件操作的属性信息 例如,您可以定义“music_style”或“singer_name”作为“play”事件的参数,也可以定义“play_time”作为事件的参数。
value:自定义事件参数下的参数值,用于描述事件属性的详细信息。 例如,“play”事件下“music_style”的参数值可以是“slight”、“rock”等。数值型参数的取值是数字变量。值可以是明确的数字,如“23”;也可以是在其他位置定义的基于推断值的变量,如“downloadTime”。
自定义事件ID不可更改,需与代码中“String event_id”保持一致,参数(key)无须手动注册;
请在SDK初始化之后调用事件统计接口;
如果需要在子进程中对自定义事件进行统计,需要在SDK初始化完成后调用函数UMConfigure.setProcessEvent。
event ID或者key请使用英文、数字、下划线、中划线及加号进行定义,使用其中一种或者几种都可以,不能以“数字”开头,避免使用中文。为保证数据计算的准确性,非这些“合法”以外的字符无法添加,具体限制请查看下文注意事项;
每个应用不限制添加自定义事件的个数,每个自定义事件的参数上线是256个,每个参数的值没有限制个数,每条日志最大长度为200KB。
为方便使用者理解及使用,可通过显示名称进行重命名(支持中文),进入【应用设置-事件-编辑】进行操作;
埋码完成后,建议使用集成测试进行验证;
event id长度不能超过1024个字节,key不能超过4096个字节,当自定义属性值value为数组元素时,数组长度上限为100
id、ts、du、token、device_name、device_model 、device_brand、country、city、channel、province、appkey、app_version、access、launch、pre_app_version、terminate、no_first_pay、is_newpayer、first_pay_at、first_pay_level、first_pay_source、first_pay_user_level、first_pay_versio是保留字段,不能作为event id 及key的名称
版本号修改
/** 自定义app版本号,默认获取version,只可设置一次建议在所有接口之前调用
@param appVersion 自定义版本号
*/
+ (void)setAppVersion:(NSString *)appVersion;参数 | 类型 | 描述 | 备注 |
appVersion | NSString | 自定义版本号 | 不使用该接口时默认获取version |
注:只可设置一次建议在所有接口之前调用
埋点验证功能
在完成SDK集成和自定义事件埋点后,可以使用埋点验证功能查看埋点日志。操作步骤如下:
添加您的 URL Scheme 到项目中,URL Scheme 位于项目设置 target ->选项卡 Info ->URL Types。填入的scheme:atm.yourappkey。在AppDelegate中调用函数[MobClick handleUrl:url]来接收 URL
- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
if ([MobClick handleUrl:url]) {
return YES;
}
return YES;
}1.进入Quick A+采集模块中的“埋点验证”功能,选择APP验证;
2.在“请输入scheme测试”输入框中填入“atm.你的appkey”;

3.用扫码软件(可使用所有带扫描功能的app,建议使用UC浏览器)扫描二维码;
4.扫码后会自动唤起您的App,同时pc端自动调转到实时调试页面,操作应用时,pc端实时调试页面会有日志输出。