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

Mik*_*tti 3 analytics objective-c usage-statistics ios

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

Mat*_*s R 6

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

@interface BaseViewController : UIViewController

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

@end
Run Code Online (Sandbox Code Playgroud)

该实现仅测量屏幕外观之间的秒数,直到它消失.注意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
Run Code Online (Sandbox Code Playgroud)

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

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