iOS 统计分析 SDK 使用指南

1.建立App,下载SDK( Top )

登录你的帐号后,看到友盟的管理后台,点击"+添加新应用",进入新应用信息填写的页面。 在新应用信息填写中,请尽量填写真实的信息。 App建立成功后,可以获得该App的AppKey,以及最新的开发指南和SDK文件。

*Tips
您可以通过友盟统计分析平台的特性节省重复建立App的时间。如果您要对App不同的发布渠道进行统计,不需要创建新App (具体使用请查看 5.使用多渠道统计),通过多渠道统计,您可以更方便的对比数据。

2.加入XCode工程,实现基本使用 ( Top )
  • 导入SDK
    • 下载Analytics_iPhone_SDK_1.7.zip并解压缩
      解压缩之后可以看到如下2个文件: MobClick.h libMobClickLibrary.a
    • 导入插件
      请在你的工程目录结构中,右键选择Add->Existing Files...选择这两个文件。或者将这两个文件拖入XCode工程目录结构中,在弹出的界面中选择Copy items into destination group's folder(if needed),并确保Add To Targets中,需要使用友盟统计服务的Target App是处于选中状态。

    • 添加依赖框架(Framework)
      无,不再需要手动link任何Framework. 如果是从老版本友盟SDK升级过来,other linker flag里有-all_load -ObjC的话也一并去掉.
  • 嵌入代码
    • 打开*AppDelegate.m(*代表你的工程名字),添加如下语句
    • 在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法内添加如下语句:
                                                    [MobClick startWithAppkey:@"xxxxxxxxxxxxxxx"];
                                                  
      应用程序每次只会在启动时会向服务器发送一次消息(BATCH策略),在应用程序过程中产生的所有消息(包括自定义事件和本次使用时长)都会在下次启动时候发送。 如果应用程序启动时处在不联网状态,那么消息将会缓存在本地,下次再尝试发送。如果需要使用实时(REALTIME策略)发送方式,或者修改渠道名称(channelId),请使用下面的方法:
                                                    [MobClick startWithAppkey:@"xxxxxxxxxxxxxxx" reportPolicy:REALTIME channelId:nil];
                                                  

      (使用建议,建议使用BATCH形式,减少App与网络的交互,为用户节约流量. channelId 为nil或@""时,默认会被被当作@"App Store"渠道)

    到此,基本统计功能集成已经完成。
3.使用自定义事件( Top )

使用自定义事件功能请先在网站应用管理后台(设置->编辑自定义事件)中添加相应的自定义事件后,服务器才会对相应的自定义事件请求进行处理。这里我们将提供几个简单而通用的接口:
1、简单事件

+ (void)event:(NSString *)event_id;
将统计event_id对应事件的发生次数,变化趋势,例如广告点击,短信数量等等。event_id为当前统计的事件ID,您可以在程序里直接定义,但是我们推荐您在友盟网站上预先定义。
一个例子,监测应用程序里广告的点击次数,事件ID为“ad_click”。那么需要在程序里每次广告点击后调用 [MobClick event:@"ad_click"]; 通知服务器一个广告点击事件。
简单事件
2、多标签事件
+ (void)event:(NSString *)event_id label:(NSString *)label;
除了能够统计event_id所对应事件的发生次数,变化趋势外,还能统计此事件中具体标签所占的比例,label为当前标签。
例如:在应用程序“星座罗盘”中,定义了一个事件的ID为“Constellation”,这个ID对应的名称可以在友盟的管理后台里添加,我们把名称修改为:星座关注分布,每个星座对应这个事件的一个事件标签,我们可以在生成的统计图表中看到用户关注不同星座的比例。
[MobClick event:[NSString stringWithFormat:@"Constellation"] label:astroName]; //astroName是变量,表示星座的名称
多标签事件
3、事件累计
在应用程序中某些自定义事件可能会被频繁触发,例如用户点击某个按钮。开发者可以在程序中维护一个计数器,这样某个事件被多次触发但只需要生成一个消息,这个消息中包括该事件被触发的次数。为了支持这个功能,这里我们定义了两个新接口:
+ (void)event:(NSString *)event_id acc:(NSInteger)acc;
+ (void)event:(NSString *)event_id label:(NSString *)label acc:(NSInteger)acc;

参数acc是对应事件 (和对应标签)被触发的次数。

4.使用用户反馈 ( Top )

在程序中通过

[MobClick showFeedback:rootViewController];
/*介绍:
 *		类方法,弹出一个默认的反馈界面,生成一条反馈记录,并保存到本地缓存
 *参数说明:
 *		rootViewController:会用来弹出presentModalViewController方法来展示反馈界面
 *		请确保rootViewController非空
 *		
 */	
                                        

方法进行调用,请确保传入的参数rootViewController非空。 默认反馈界面如下图所示.
默认反馈界面
iPad下默认反馈界面如下图所示.
默认反馈界面
当然您可以自定义反馈界面,如下面这个例子.
自定义反馈界面
要实现上面的效果,您需要自定义view试图,调用feedbackWithDictionary:(NSDictionary * )feedbackDict方法即可.友盟Feedback并没有提供Email手机号之类的字段, 如果您需要添加这些信息,可以把这些额外字段信息以一定的分隔符附加到UMengFeedbackContent上.

/*方法名:
 *		+(void)feedbackWithDictionary:(NSDictionary * )feedbackDict;
 *介绍:
 *		类方法,生成一条反馈记录,并保存到本地缓存。这是自定义反馈的数据接口,视图方面请自己定义,调用该接口传送数据即可。
 *参数说明:
 *		Dictionary中应该有以下三个键名:
 *      @"UMengFeedbackGender" @"UMengFeedbackAge" @"UMengFeedbackContent"
 *		键值部分:
 *		都是NSString类型的,其中性别和年龄是填写数字代表
 *		对应关系是 1=>男 2=>女
 *		年龄部分的对应关系是 
 *		1=>18岁以下(不含18岁),2=>18-24岁,3=>25-30岁,
 *		4=>31-35岁,5=>36-40岁,6=>41-50岁,7=>51-59岁,8=>60岁及60岁以上
 *
 *       请在调用该方法之前自行判断键值的完整性和正确性,否则会保存失败
 *       这些键值会保存到本地中,并在下次提交数据时上传到服务器
 *返回值:
 *      无
 *
 */
                                            

5.使用多渠道统计( Top )

当你选择多种程序分发渠道时,例如某Cydia源,或某网站,可以为不同渠道(提供不同)的软件包进行分发渠道的设定,以便统计终端用户得到程序的来源。 如果您只有 App Store一个分发渠道,则不再需要做设定,我们会默认标记为App Store。
参加上面 (2.加入XCode工程,实现基本使用)


//*   注意:服务器端对设备只进行一次统计,以后更改渠道名对该设备并不进行更新。
//*	  所以再测试不同的渠道的时候,请使用不同的设备来分别测试。

            
例如您在91发布,需要统计91渠道:
- [MobClick startWithAppkey:@"xxxxxxxxxxxxxxx" reportPolicy:REALTIME channelId:@"91store"];
例如您在同步推发布,需要统计同步推渠道:
- [MobClick startWithAppkey:@"xxxxxxxxxxxxxxx" reportPolicy:REALTIME channelId:@"tongbu"];

6.按渠道自动更新检测( Top )

在友盟的网站上分渠道提交app的版本号,更新日志及openURL后,您只需添加一行代码来完成自动更新检查
请将下面代码添加到[MobClick startWithAppkey:@"xxxxxxxxxxxxxxx"];之后

[MobClick checkUpdate];
自动更新检查
当然您可以自定义标题和按钮的文字
[MobClick checkUpdate:@"New version" cancelButtonTitle:@"Skip" otherButtonTitles:@"Goto Store"];
自动更新检查
如果默认的行为不满足你的需求,您可以完全自定义自动更新检查行为。只需实现- (void)appUpdate:(NSDictionary *)appInfo;这个delegate方法. appInfo是服务器传回来的app相关信息。

7.使用在线参数功能,可以让你动态修改应用中的参数值
例如:动态修改应用的欢迎语,修改应用中开关选项的"on"或"off",以及类似游戏中虚拟物品的价格。 ( Top )

您需要在[MobClick startWithAppkey:@"xxxxxxxxxxxxxxx"]之后添加

[MobClick updateOnlineConfig];
这句代码从服务器获取在线参数,并缓存本地。 当在项目里需要获取某个具体参数时调用
[MobClick getConfigParams:@"xxxx"];
xxxx为友盟服务器上事先设置好的key,获取失败返回nil. 如果你想获取所有的在线参数,请使用.
[MobClick getConfigParams];
这两个方法都是从[NSUserDefaults standardUserDefaults]获取缓存的值, 所以上面的[MobClick updateOnlineConfig]方法要先在app启动时被调用。
注意:updateOnlineConfig 只有在app启动时(application:didFinishLaunchingWithOptions)执行,前后台切换是不会执行的。

8.动态调整发送策略
现在您可以在线更改SDK端的数据报告发送策略了,SDK将根据以下优先级决定最终的数据发送策略
在线配置指定的报告发送策略.
由API调用指定的报告发送策略。
默认使用启动时发送策略。 ( Top )

和上面的使用在线参数功能一样,您需要在[MobClick startWithAppkey:@"xxxxxxxxxxxxxxx"]之后添加

[MobClick updateOnlineConfig];
这句代码从服务器获取在线参数,同时获取您的发送策略,并缓存本地。 剩下的都交给友盟SDK来做了.
注意:updateOnlineConfig 只有在app启动时(application:didFinishLaunchingWithOptions)执行,前后台切换是不会执行的。

9.页面访问路径统计
您可以统计每个View停留时长 ( Top )

需要配对使用

                                  - (void)viewWillAppear:(BOOL)animated
                                  {
                                  	[super viewWillAppear:animated];
                                    [MobClick beginLogPageView:@"PageOne"];
                                  }

                                 
                                  - (void)viewWillDisappear:(BOOL)animated {
                                     [super viewWillDisappear:animated];
                                     [MobClick endLogPageView:@"PageOne"];
                                  }
                                 
如果您想自己传递时长,我们也提供了方法。 单位为秒.
                                  + (void)logPageView:(NSString *)pageName seconds:(int)seconds;