如何检查iOS设备自启动以来是否已重新启动

6

我希望了解人们对此有什么想法。基本上,我想知道自从我的应用程序上次启动以来,实际设备是否已经重新启动。人们用什么方法来找出这一点?(如果有的话?)

我考虑过使用mach_absolute_time,但这仍然是一种不可靠的方法。

谢谢。

2个回答

5

嗨,Alex,我将尝试执行内核任务处理器的正常运行时间。我会告诉你我的进展! - Aron
冒昧问一句,这个和CACurrentMediaTime()有什么区别?我理解这个函数会将mach_absolute_time可靠地转换为秒(mach_absolute_time是设备重启以来的时间量)。我的理解正确吗? - Aron
@Aron,抱歉我对此不是很了解。只是阅读了苹果的问答。内核任务处理方法进行得如何了?有什么进展吗? - Alex Stuckey
我最终使用了经过CACurrentMediaTime()封装的mach_absolute_time方法。我可以通过CACurrentMediaTime()(本质上是mach_absolute_time的一种方便方法)和LastTimeIntervalSince1970计算上次重启时间。将其与缓存值进行比较,即可确定设备是否已重新启动。 - Aron

0

这是我写的一个程序。它获取当前的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;
}

不要使用 -[NSUserDefaults synchronize]。根据苹果文档的说明,"这个方法是不必要的,不应该被使用"。 - Ashley Mills
另外,请勿在多个问题中提供相同的答案。只需在评论中提供链接即可。https://dev59.com/xUnSa4cB1Zd3GeqPNmnu#51391327 - Ashley Mills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接