Mik*_*tti 3 analytics objective-c usage-statistics ios
跟踪用户在App中查看屏幕(或与UIView交互)使用的App使用时间和时间的最佳方法是什么?谷歌分析似乎做得很好,但我想在应用程序内部使用的数字来解锁应用程序的项目和区域.
您可以根据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可能应该在另一个类中).但这是一个好的,有效的开始.
| 归档时间: |
|
| 查看次数: |
1839 次 |
| 最近记录: |