我希望了解人们对此有什么想法。基本上,我想知道自从我的应用程序上次启动以来,实际设备是否已经重新启动。人们用什么方法来找出这一点?(如果有的话?)
我考虑过使用mach_absolute_time,但这仍然是一种不可靠的方法。
谢谢。
我希望了解人们对此有什么想法。基本上,我想知道自从我的应用程序上次启动以来,实际设备是否已经重新启动。人们用什么方法来找出这一点?(如果有的话?)
我考虑过使用mach_absolute_time,但这仍然是一种不可靠的方法。
谢谢。
不确定这是否符合您的要求,但请看这个:
https://github.com/pfeilbr/ios-system-uptime
在这个例子中,作者从内核任务进程中获取它。这是我写的一个程序。它获取当前的GMT时间和自上次重启以来的时间,推算出设备上次重新启动的日期,并使用NSUserDefaults在内存中跟踪此日期。享受吧!
注意:由于您想要检查自上次应用程序启动以来的时间,因此您需要确保在每次启动应用程序时调用该方法。最简单的方法是在 +(void)initialize {
中调用下面的方法,然后在需要手动检查它的任何时候也调用它。
#define nowInSeconds CFAbsoluteTimeGetCurrent()//since Jan 1 2001 00:00:00 GMT
#define secondsSinceDeviceRestart ((int)round([[NSProcessInfo processInfo] systemUptime]))
#define storage [NSUserDefaults standardUserDefaults]
#define DISTANCE(valueOne, valueTwo) ((((valueOne)-(valueTwo))>=0)?((valueOne)-(valueTwo)):((valueTwo)-(valueOne)))
+(BOOL)didDeviceReset {
static BOOL didDeviceReset;
static dispatch_once_t onceToken;
int currentRestartDate = nowInSeconds-secondsSinceDeviceRestart;
int previousRestartDate = (int)[((NSNumber *)[storage objectForKey:@"previousRestartDate"]) integerValue];
int dateVarianceThreshold = 10;
dispatch_once(&onceToken, ^{
if (!previousRestartDate || DISTANCE(currentRestartDate, previousRestartDate) > dateVarianceThreshold) {
didDeviceReset = YES;
} else {
didDeviceReset = NO;
}
});
[storage setObject:@(currentRestartDate) forKey:@"previousRestartDate"];
[storage synchronize];
return didDeviceReset;
}