跟踪UIViewController(如Google Analytics)上的用户使用时间和时间

时间:2014-04-05 19:48:09

标签: ios objective-c analytics usage-statistics

跟踪用户在App中查看屏幕(或与UIView交互)使用的App使用时间和时间的最佳方法是什么?谷歌分析似乎做得很好,但我想在应用程序内部使用的数字来解锁应用程序的项目和区域。

2 个答案:

答案 0 :(得分:5)

您可以根据Core Data推出自己的解决方案,或者如果您的数据很小,您甚至可以考虑使用NSDefaults。 这是一个好的开始。它涉及到一个基本视图控制器,你应该在每个视图控制器中继承你想要测量花费的时间:

@interface BaseViewController : UIViewController

- (NSString *)screenKey;
+ (NSInteger)secondsInScreen:(NSString *)screenKey;

@end

该实现仅测量屏幕外观之间的秒数,直到它消失。注意appDidEnterForeground和appDidEnterBackground通知非常重要。当您将应用程序发送到后台或返回到前台时,不会调用viewDidAppear和viewDidDisappear。

#import "BaseViewController.h"

@implementation BaseViewController {
    NSDate *_startDate;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self startMeasuring];
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    [self stopMeasuring];
}

- (void)appDidEnterBackground:(NSNotification *)not {
    [self stopMeasuring];    
}

- (void)appDidEnterForeground:(NSNotification *)not {
    [self startMeasuring];
}

- (void)startMeasuring {
    _startDate = [NSDate date];
}

- (void)stopMeasuring {
    NSInteger secondsInScreen = ABS([_startDate timeIntervalSinceNow]);
    [self addSecondsToScreen:secondsInScreen];
}

- (NSString *)screenKey {
    // Subclasses must override this method
    return @"";
}

- (void)addSecondsToScreen:(NSInteger)seconds {
    NSString *key = [self screenKey];
    if (key.length > 0) {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSNumber *s = [defaults objectForKey:key];
        NSInteger addedSeconds = s.integerValue + seconds;
        [defaults setObject:[NSNumber numberWithInteger:addedSeconds] forKey:[self screenKey]];
        [defaults synchronize];
    }
}

+ (NSInteger)secondsInScreen:(NSString *)screenKey {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSNumber *s = [defaults objectForKey:screenKey];
    return s.integerValue;
}

@end

您的子类必须覆盖screenKey,为您要测量的每个屏幕重新调整唯一标识符。 BaseViewController中有一个静态方法,可以让你获得每个屏幕花费的秒数。

这是一种简单的方法。从设计的角度来看,最好将此信息存储在Core Data中,并将视图控制器逻辑与该数据的存储区分开(静态方法secondsInScreen可能应该在另一个类中)。但这是一个良好的,有效的开始。

答案 1 :(得分:0)

我认为您希望获得应用使用时间以启用应用中的新功能或为您的用户提供一些礼物吗?

要实现这一目标,请不要使用任何SDK来跟踪Google Analytics和Flurry等受众群体。两者都是出于你想要的不同目的。

一种非常简单的方法是使用NSUserDefaults在本地存储某些用户的会话时间,或者您可以使用CoreData或SQLite存储有关此内容的更多详细信息。

iOS为您提供了很多选项,例如,每次用户启动会话或打开某个屏幕时,您都可以存储一些NSDatemach_abosulte_time以节省时间用户启动了会话/屏幕,您可以在应用程序进入后台或用户关闭屏幕时获得偏移时间。

如果您想远程存储(服务器),您可以创建一个服务,以便在应用程序可见时发送此时间。

我希望这第一个见解可以帮到你。