一、应用统计SDK开发的作用:
- 应用趋势:清晰展现应用的新增用户、活跃用户、启动次数、版本分布、行业指标等数据,方便从整体掌控应用的运营情况及增长动态
- 渠道分析:在哪里推广最有效?从哪里获取的用户最有价值?友盟统计渠道分析功能可以实时查看各渠道的新增用户、活跃用户、次日留存率等用户指标,通过数据对比评估不同渠道的用户质量和活跃程度,从而衡量推广效果。
- 留存分析:可以掌握每日(周/月)的新增用户在初次使用后一段时间内的留存率,留存率的高低一定程度上反映了产品和用户质量的好坏
-
用户属性:用户的基本属性和行为特征,帮助您全面了解用户。
-
行为分析:针对性地进行应用内的数据统计,了解用户的产品使用细节及行为特征,帮助团队寻找产品改进的突破点,评估产品优化的效果
二、应用统计SDK开发应该注意的地方
- 所有类别加上前缀,避免在项目中和别的类别重名
- 需要适配所有设备,ios的sdk应该适配iphone、ipad、ipod touch等设备,例如:如果采集运营商信息要注意区分设备,因为部门ipad和ipod touch是没有SIM卡的,如果没有做区分,则会引起异常。
- 严格遵守苹果公司审核规则,不去调用私有api。
- 适配声明的系统,一般支持6.0以上。
- 不要把第三方库打包进SDK
三、应用统计SDK的设计逻辑
- 服务端分配appId和appKey,前端SDK启动时进行验证。
- SDK向服务端发送appId和appKey进行启动验证时,如果验证通过将会返回前端指定的日志上传策略。策略共有启动上传、实时上传和定时上传三种,前端SDK默认策略为启动上传。(注意:打开调试模式-debug模式后,数据实时发送,不受发送策略控制)
- 启动上传 每次启动前将上次缓存的操作发送到采集服务器。
- 实时上传 每次有操作日志都立刻上传到服务器。
- 定时上传 到了或者超过了设置的时间自动上传到服务器。
- 设置sessionID,为了区分用户操作,采用sessionID来辨别用户具体操作,应用切换到后台默认停留超过30秒时间将重新生成一个sessionID,也可以给出接口让开发者自行设置生产sessionID时间。
- 页面的统计:页面统计集成正确,才能够获取正确地页面访问路径、访问深度(PV)的数据,因此需要在控制器的生命周期函数中配对使用sdk的接口去进行统计:
//页面开始跳转监听,请在每个view的viewWillApear中调用
+(void)beginEvent:(NSString*)page;
//页面结束跳转监听,请在每个view 的viewWillDisApear中调用
+(void)endEvent:(NSString*)page;
- 自定义事件统计:自定义事件统计可以实现在应用程序中埋点来统计用户的点击行为,例如:文章或者信息分享到社交平台、详情点击阅读等等。当然也可以参照与服务器约定的事件ID进行传值。其相关接口定义为:
+(void)postEvent:(NSString*)operateType seviceParm:(NSString*)seviceParm operateObjID:(NSString*)operateObjID;
operateType:用户操作类型,与服务器约定;
serviceParm:服务描述,可为nil;
operateObjID:操作对象,可为nil。
- 采集用户地理位置信息,可给出接口,让开发者设置是否采集用户地理位置信息。
- 上传及记录日志采用异步的形式,不影响主线程。
1将WebViewJavascriptBridge文件拖进你的工程中,弹出框中不要选Copy items into desination group’s folder,选择Creat groups for any folders
2引入头文件
#import "WebViewJavascriptBridge.h"
3用UIWebView实例化WebViewJavascriptBridge
代码:
WebViewJavascriptBridge* bridge = [WebViewJavascriptBridge bridgeForWebView:webView handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"Received message from javascript: %@", data);
NSDictionary *dic = (NSDictionary*)data;
NSString *operateType = [dic objectForKey:@”operateType”];
NSString *serviceParm = [dic objectForKey:@” serviceParm”];
NSString *operateObjID = [dic objectForKey:@” operateObjID”];
[Analytics postEvent:operateType serviceParm:serviceParm operateObjID:operateObjID];
responseCallback(@"Right back atcha");
}];
//注:此处的data数据即为OBJC接收到得中javascript处发送给OBJC端的数据(此处数据请参看5中发送的数据),使用SDK监听webView事件只需在此处接收数据,并使用SDK的接口,将接收的数据作为参数,这里的参数webView即为需要监听的webview对象.
4从OBJC向javascript发送数据:
[bridge send:@"Well hello there"];
[bridge send:[NSDictionary dictionaryWithObject:@"Foo" forKey:@"Bar"]];
[bridge send:@"Give me a response, will you?" responseCallback:^(id responseData) {
NSLog(@"ObjC got its response! %@", responseData);
}];
注:此处与调用SDK接口无关,有需要的可以自行调用,否则无需在程序中实现此步骤。
5在javascript处进行设置
代码:
function connectWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) {
callback(WebViewJavascriptBridge)
} else {
document.addEventListener('WebViewJavascriptBridgeReady', function() {
callback(WebViewJavascriptBridge)
}, false)
}
}
connectWebViewJavascriptBridge(function(bridge) {
/* Init your app here */
bridge.init(function(message, responseCallback) {
alert('Received message: ' + message)
if (responseCallback) {
responseCallback("Right back atcha")
}
})
//注2
bridge.send('Hello from the javascript')
bridge.send('Please respond to this', function responseCallback(responseData) {
console.log("Javascript got its response", responseData)
})
})
注:bridge.send()方法即为向objc发送数据的接口,要调用bridge.send()方法必须在connectWebViewJavascriptBridge(function(bridge)){}中进行调用,否则无效,在此处进行设置监听的方法,例如:
HTML文件中有元素<button id=”buttton”>click</button>
则可在javascript(注2处)中使用下列代码对button进行监听,触发时向OBJC发送数据:
document.getElementById(“button”).οnclick=function()
{
var data={‘operateType:’001’,’serviceParm’:’测试’,’operateObjId’:’01001’}
bridge.send(data)
或者
bridge.send(data,function(responseData){
})
}
- 启动上传 每次启动前将上次缓存的操作发送到采集服务器。
- 实时上传 每次有操作日志都立刻上传到服务器。
- 定时上传 到了或者超过了设置的时间自动上传到服务器。