期待看到人们为此想出了什么。基本上我想知道自从我的应用程序上次启动以来是否已重新启动实际设备。人们用什么方法来找出它? (如果有的话?)
我考虑过使用mach_absolute_time,但这仍然是一种不可靠的方法。
干杯
答案 0 :(得分:5)
不确定这是否是您想要的,但请看一下:
https://github.com/pfeilbr/ios-system-uptime
在此示例中,作者从内核任务进程中获取它。
或者您可以看看mach_absolute_time路线,有一个官方的Apple Q& A具有类似的目标https://developer.apple.com/library/mac/#qa/qa1398/_index.html
希望这有帮助。
答案 1 :(得分:-1)
这是我做的一个。需要使用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;
}