我们的App是一个媒体中心编辑、记者使用的工具APP。为了及时反馈客户,优化代码。项目经理决定在关键模块进行友盟统计的埋点。
之前我们的App已经集成了友盟SDK,主要是为了利用友盟的自动化收集机制,收集程序崩溃信息。这次利用SDK提供的功能,决定进行更细致的埋点统计,主要是为了解决出现故障时候,可以由开发人员定位故障发生位置,当时的情况和故障的大致原因。为后续的代码优化提供依据。
开发组内部讨论后,由于大部分故障都和API接口的调用有关,因此埋点位置,主要在API接口调用层。友盟SDK的接口文档,规定可以自定义事件,每个事件可以定义500个属性。
我们制定的统计协议如下:
1)按照接口URL简写设定事件ID;
2)事件属性设置如下:
a)response_Result 返回结果统计字符串
格式:时间_SUCCESS_cost:耗时_发生界面_(可选)_下个接口
b)request_Params 传入请求统计,知道这个API调用者和开始调用时间
格式:时间_用户ID_发生界面
c) response_error 返回错误的统计字符串
格式:时间_FAIL_cost:耗时_失败日志(可中文)_发生界面
最后出现在统计界面效果如下:
先对于UM的SDK使用进行,底层封装。
代码如下:
#import <Foundation/Foundation.h>
#import <UMCommon/UMCommon.h>
#import <UMCommon/UMConfigure.h>
#import <UMCommonLog/UMCommonLogHeaders.h>
#import <UMCommon/UMCommon.h>
#import <UMPush/UMessage.h>
#import <UMAnalytics/MobClick.h>
#import <UMCommonLog/UMCommonLogHeaders.h>
NS_ASSUME_NONNULL_BEGIN
@interface AppDelegateUM : NSObject
@property(nonatomic,assign)int cost_time;//记录耗时
//拼接response_Result 推送response_Result到友盟
+(void)PushResponse_ResultToUM:(NSString *)eventid /*事件ID**/
costtime:(long)costtime /*耗时**/
activeInterface:(NSString *)activeInterface /*传入发生界面**/
nextAPI:(NSString *)nextAPI /*传入下个接口**/
activeDate:(NSString *)activeDate ; /*传入发生时间**/
//拼接request_Params 推送request_Params到友盟
+(void)Pushrequest_ParamsToUM:(NSString *)eventid /*事件ID**/
activeInterface:(NSString *)activeInterface /*传入发生界面**/
userid:(NSString *)userid /*传入用户ID**/
activeDate:(NSString *)activeDate ; /*传入发生时间**/
//拼接 response_error 推送response_error到友盟
+(void)Pushresponse_errorToUM:(NSString *)eventid /*事件ID**/
costtime:(long)costtime /*耗时**/
activeInterface:(NSString *)activeInterface /*传入发生界面**/
failLog:(NSString *)failLog/*传入失败日志**/
activeDate:(NSString *)activeDate ; /*传入发生时间**/
/**获取当前时间戳*/
+(long)GetNowTimeTimestamp;
/*获取当前时间**/
+(NSString *)getCurrentTime;
+(void)UP;
//计数事件
//统计事件发生的次数
+(void)countEvent:(NSString *)eventid;
//NSDictionary *dict = @{@"type" : @"book", @"quantity" : @"3"};
//统计事件发生的属性的次数
+(void)countEventByAttr:(NSString *)eventid attr:(NSDictionary *)dict;
//计算事件
//NSDictionary *dict = @{@"type" : @"book", @"quantity" : @"3"};
//统计事件发生的属性的次数
+(void)countEventByAttrAndCount:(NSString *)eventid attr:(NSDictionary *)dict counter:(int)counter;
//自定义事件
//记录接口的成功返回
//记录事件定义 和成功返回的属性值 传入参数
/**
eventid 事件ID
url API地址
para 传入参数
jsonRes 返回值
*/
+(void)recordApiSuccessRes:(NSString *)eventid url:(NSString *)url para:(NSString *)para jsonRes:(NSString *)jsonRes;
//记录接口的失败返回
//记录事件定义 和成功返回的属性值 传入参数
/**
eventid 事件ID
url API地址
para 传入参数
jsonRes 返回值
*/
+(void)recordApiErrorRes:(NSString *)eventid url:(NSString *)url para:(NSString *)para jsonRes:(NSString *)jsonRes;