iOS中自定義界面統計(統計一定時間內訪問次數,以及停留時間)

由於我們的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");

           }

}];




}



最後別忘了每次重新進入的時候把上次數據清空,重新計算







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章