由於我們的app做的是p2p以及奇葩的產品經理,好好的友盟統計不用,非要用自己和服務器交互的統計,只能自己寫,然後每隔一段時間上傳一次咯!
直接上代碼吧!
1.首先自定義一個類:(用於統計次數和停留時間的方法)
//
// statistics.h
// WuXianMoney
//
// Created by GF on 16/3/29.
// Copyright © 2016年 WXDL. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface statistics : NSObject
/*
簡易統計界面停留時間/以及次數:
*/
+(void)staticsvisitTimesDataWithViewControllerType:(NSString *)type;//統計次數
+(void)staticsstayTimeDataWithType:(NSString *)type WithController:(NSString *)name;//統計時間計算,type: 1代表進入界面 2 :出界面
+(NSString *)staticsTimeDataWithController:(NSString *)name;//統計時間,一直停留的
+(NSString *)getStayTime:(NSString *)controller;
+(void)removeLocalDataWithController:(NSString *)name;//清除本地數據;
+(NSDictionary *)packageDictionary:(NSString *)name WithType:(NSString *)type;//打包字典
@end
//
// statistics.m
// WuXianMoney
//
// Created by GF on 16/3/29.
// Copyright © 2016年 WXDL. All rights reserved.
//
#import "statistics.h"
@implementation statistics
/*
key值-Value值對應關係:
界面名稱:----訪問次數
1界面名稱----進入界面時刻
2界面名稱-----離開界面時刻
界面名稱histime------界面停留歷史時間
界面名稱time--------界面停留總時間
界面名稱oppositeTime----相對時間
*/
#pragma mark-
#pragma mark 統計次數
+(void)staticsvisitTimesDataWithViewControllerType:(NSString *)type
{
NSString * timesStart=[ZJDataSaver getStringForKey:type]?[ZJDataSaver getStringForKey:type]:nil;
int add=[timesStart intValue];
add++;
[ZJDataSaver saveString:[NSString stringWithFormat:@"%d",add] forKey:type];
}
+(void)staticsstayTimeDataWithType:(NSString *)type WithController:(NSString *)name//計算一次在該界面停留的時間
{
switch ([type intValue]) {
case 1://用來獲取進入界面的時刻
{
NSDate * date=[NSDate date];
NSString * dateStr=[NSString stringWithFormat:@"%0.f",[date timeIntervalSince1970]];
[ZJDataSaver saveString:dateStr forKey:[NSString stringWithFormat:@"%@%@",type,name]];
}
break;
case 2://用來獲取離開界面的時刻 /**/
{
NSDate * date=[NSDate date];
NSString * dateStr=[NSString stringWithFormat:@"%0.f",[date timeIntervalSince1970]];
[ZJDataSaver saveString:dateStr forKey:[NSString stringWithFormat:@"%@%@",type,name]];
NSString * startTime=[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@%@",@"1",name]]?[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@%@",@"1",name]]:@"0";//進入界面時間
NSString * endTime=[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@%@",@"2",name]]?[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@%@",@"2",name]]:@"0";;//離開界面時間
long time=0;
if([endTime longLongValue]==0)
{
time=0;
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@%@",@"1",name]];//移除開始時間
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@%@",@"2",name]];
}
else
{
time=[endTime longLongValue]-[startTime longLongValue];
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@%@",@"1",name]];
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@%@",@"2",name]];
}
NSString * hisTime=[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@histime",name]];//歷史時間
long ZTime=[hisTime longLongValue]+time;
NSString * Time=[NSString stringWithFormat:@"%ld",ZTime];//該界面的總時間
[ZJDataSaver saveString:Time forKey:[NSString stringWithFormat:@"%@time",name]];//存儲總時間
[ZJDataSaver saveString:Time forKey:[NSString stringWithFormat:@"%@histime",name]];//存儲歷史時間
}
break;
default:
break;
}
}
+(NSString *)staticsTimeDataWithController:(NSString *)name
{
NSString * hisTime=[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@histime",name]];//歷史時間
NSString * startTime=[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@%@",@"1",name]]?[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@%@",@"1",name]]:@"0";//進入界面時間
long oppositeTime=[hisTime longLongValue]-[startTime longLongValue];//相對時間,針對只有開始時間,一直停留在該界面的處理情況
NSDate * date=[NSDate date];
NSString * dateStr=[NSString stringWithFormat:@"%0.f",[date timeIntervalSince1970]];
long time=[dateStr longLongValue]+oppositeTime;
//[ZJDataSaver saveString:[NSString stringWithFormat:@"%ld",time] forKey:[NSString stringWithFormat:@"%@ztime",name]];
[ZJDataSaver saveString:dateStr forKey:[NSString stringWithFormat:@"%@%@",@"1",name]];
[statistics staticsvisitTimesDataWithViewControllerType:name];
return [NSString stringWithFormat:@"%ld",time];
}
+(NSString *)getStayTime:(NSString *)controller
{
NSString * time=[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"1%@",controller]]&&![ZJDataSaver getStringForKey:[NSString stringWithFormat:@"2%@",controller]]?[statistics staticsTimeDataWithController:[NSString stringWithFormat:@"%@",controller]]:[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@time",controller]];
return time;
}
+(void)removeLocalDataWithController:(NSString *)name
{
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@",name]];
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@time",name]];
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@histime",name]];
Save(@"",@"StaticsArray");
Remove(@"StaticsArray");
}
+(NSDictionary *)packageDictionary:(NSString *)name WithType:(NSString *)type//打包字典
{
NSString * time=[statistics getStayTime:[NSString stringWithFormat:@"%@",name]];//判斷是否一直停留在該界面,離開取總時間,停留取相對時間
NSMutableArray * dataArray=Get(@"StaticsArray")?Get(@"StaticsArray"):[NSMutableArray array];
NSDictionary * dic=@{@"visitName":[NSString stringWithFormat:@"%@",name],@"visitType":[NSString stringWithFormat:@"%@",type],@"visitTimes":[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@",name]]?[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@",name]]:@"0",@"staySeconds":time?time:@"0"};
[dataArray addObject:dic];
Save(dataArray, @"StaticsArray");
NSDictionary * BigDic=@{@"list":dataArray};
return BigDic;
}
@end
//
// statistics.m
// WuXianMoney
//
// Created by GF on 16/3/29.
// Copyright © 2016年 WXDL. All rights reserved.
//
#import "statistics.h"
@implementation statistics
/*
key值-Value值對應關係:
界面名稱:----訪問次數
1界面名稱----進入界面時刻
2界面名稱-----離開界面時刻
界面名稱histime------界面停留歷史時間
界面名稱time--------界面停留總時間
界面名稱oppositeTime----相對時間
*/
#pragma mark-
#pragma mark 統計次數
+(void)staticsvisitTimesDataWithViewControllerType:(NSString *)type
{
NSString * timesStart=[ZJDataSaver getStringForKey:type]?[ZJDataSaver getStringForKey:type]:nil;
int add=[timesStart intValue];
add++;
[ZJDataSaver saveString:[NSString stringWithFormat:@"%d",add] forKey:type];
}
+(void)staticsstayTimeDataWithType:(NSString *)type WithController:(NSString *)name//計算一次在該界面停留的時間
{
switch ([type intValue]) {
case 1://用來獲取進入界面的時刻
{
NSDate * date=[NSDate date];
NSString * dateStr=[NSString stringWithFormat:@"%0.f",[date timeIntervalSince1970]];
[ZJDataSaver saveString:dateStr forKey:[NSString stringWithFormat:@"%@%@",type,name]];
}
break;
case 2://用來獲取離開界面的時刻 /**/
{
NSDate * date=[NSDate date];
NSString * dateStr=[NSString stringWithFormat:@"%0.f",[date timeIntervalSince1970]];
[ZJDataSaver saveString:dateStr forKey:[NSString stringWithFormat:@"%@%@",type,name]];
NSString * startTime=[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@%@",@"1",name]]?[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@%@",@"1",name]]:@"0";//進入界面時間
NSString * endTime=[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@%@",@"2",name]]?[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@%@",@"2",name]]:@"0";;//離開界面時間
long time=0;
if([endTime longLongValue]==0)
{
time=0;
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@%@",@"1",name]];//移除開始時間
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@%@",@"2",name]];
}
else
{
time=[endTime longLongValue]-[startTime longLongValue];
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@%@",@"1",name]];
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@%@",@"2",name]];
}
NSString * hisTime=[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@histime",name]];//歷史時間
long ZTime=[hisTime longLongValue]+time;
NSString * Time=[NSString stringWithFormat:@"%ld",ZTime];//該界面的總時間
[ZJDataSaver saveString:Time forKey:[NSString stringWithFormat:@"%@time",name]];//存儲總時間
[ZJDataSaver saveString:Time forKey:[NSString stringWithFormat:@"%@histime",name]];//存儲歷史時間
}
break;
default:
break;
}
}
+(NSString *)staticsTimeDataWithController:(NSString *)name
{
NSString * hisTime=[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@histime",name]];//歷史時間
NSString * startTime=[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@%@",@"1",name]]?[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@%@",@"1",name]]:@"0";//進入界面時間
long oppositeTime=[hisTime longLongValue]-[startTime longLongValue];//相對時間,針對只有開始時間,一直停留在該界面的處理情況
NSDate * date=[NSDate date];
NSString * dateStr=[NSString stringWithFormat:@"%0.f",[date timeIntervalSince1970]];
long time=[dateStr longLongValue]+oppositeTime;
//[ZJDataSaver saveString:[NSString stringWithFormat:@"%ld",time] forKey:[NSString stringWithFormat:@"%@ztime",name]];
[ZJDataSaver saveString:dateStr forKey:[NSString stringWithFormat:@"%@%@",@"1",name]];
[statistics staticsvisitTimesDataWithViewControllerType:name];
return [NSString stringWithFormat:@"%ld",time];
}
+(NSString *)getStayTime:(NSString *)controller
{
NSString * time=[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"1%@",controller]]&&![ZJDataSaver getStringForKey:[NSString stringWithFormat:@"2%@",controller]]?[statistics staticsTimeDataWithController:[NSString stringWithFormat:@"%@",controller]]:[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@time",controller]];
return time;
}
+(void)removeLocalDataWithController:(NSString *)name
{
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@",name]];
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@time",name]];
[ZJDataSaver removeStringForKey:[NSString stringWithFormat:@"%@histime",name]];
Save(@"",@"StaticsArray");
Remove(@"StaticsArray");
}
+(NSDictionary *)packageDictionary:(NSString *)name WithType:(NSString *)type//打包字典
{
NSString * time=[statistics getStayTime:[NSString stringWithFormat:@"%@",name]];//判斷是否一直停留在該界面,離開取總時間,停留取相對時間
NSMutableArray * dataArray=Get(@"StaticsArray")?Get(@"StaticsArray"):[NSMutableArray array];
NSDictionary * dic=@{@"visitName":[NSString stringWithFormat:@"%@",name],@"visitType":[NSString stringWithFormat:@"%@",type],@"visitTimes":[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@",name]]?[ZJDataSaver getStringForKey:[NSString stringWithFormat:@"%@",name]]:@"0",@"staySeconds":time?time:@"0"};
[dataArray addObject:dic];
Save(dataArray, @"StaticsArray");
NSDictionary * BigDic=@{@"list":dataArray};
return BigDic;
}
@end
然後在每個視圖控制器中調用:
-(void)viewWillAppear:(BOOL)animated
{
[statistics staticsstayTimeDataWithType:@"1" WithController:@"PasswordManager"];
}
-(void)viewWillDisappear:(BOOL)animated
{
[statistics staticsvisitTimesDataWithViewControllerType:@"PasswordManager"];
[statistics staticsstayTimeDataWithType:@"2" WithController:@"PasswordManager"];
}
最後在入口類統一每隔10min上傳一次:
_controllerArray=[[NSArray alloc]initWithObjects:@"GuideView",@"HotRecommended",@"MarketView",@"FinancialDetailView",@"ProjectDetailView",@"ProvidePlatformView",@"ProtocalStorageView",@"CheckProtocalView",@"WebControllerProtocal",@"BanKListView",@"ExchangeInfo",@"FinancialHtml5View",@"MineView",@"NotificationMessageView",@"MessageTypeView",@"AssetMoreView",@"AccountInfoView",@"NikeNameView",@"PhoneViewPhone",@"VerifyPhoneViewPhone",@"SetPhoneViewPhone",@"PhoneViewEmail",@"VerifyPhoneViewEmail",@"SetPhoneViewEmail",@"AddressView",@"VIPcontroller",@"PasswordManager",@"ModifyLoginPassword",@"SetTradeController",@"ConfirmTradingPassword",@"AssetAboutUs",@"CompanyIntroView",@"PartnerView",@"CreditWebViewController",@"TodayEarningsView",@"TodayEarningsTetailView",@"TradingRecordView",@"TradeDetailView",@"WebControllerBanner",@"RegsiterOrLoginSetPhoneView",@"NewRegisterViewController",@"FindLoginPassword",@"SetPassword",@"VipDetail",nil];//視圖標示名稱
-(void)startTimer//定時器
{
__block int timeout = 0;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒執行
dispatch_source_set_event_handler(_timer, ^{
if (timeout%600==0&&timeout!=0)
{
dispatch_async(dispatch_get_main_queue(), ^{
[self loadRequest];//上傳請求
});
}
else
{
// NSLog(@"%D",timeout);
}
timeout++;
});
dispatch_resume(_timer);
}
-(void)loadRequest
{
NSDictionary * dic=[[NSDictionary alloc]init];
for(int i=0;i<_controllerArray.count;i++)
{
dic=[statistics packageDictionary:_controllerArray[i] WithType:[NSString stringWithFormat:@"%d",i+1]];
}
[RecommendRequest upTimeWithDictionary:dic WithResultBlock:^(NSDictionary *resultDic) {
for(int i=0;i<_controllerArray.count;i++)
{
[statistics removeLocalDataWithController:_controllerArray[i]];
}
if ([resultDic[@"resultCode"] intValue]==10000) {
NSLog(@"ok");
}
}];
}
最後別忘了每次重新進入的時候把上次數據清空,重新計算