在iOS / iPhone上冻结正常运行时间

有人会知道为什么我用下面的方法正在经历怪异的正常运行时间?

NSProcessInfo *processInfo = [NSProcessInfo processInfo]; NSTimeInterval systemUptime = [processInfo systemUptime]; 

第一分钟,一切似乎都很好,但是当我回到应用程序时间或天数之后,正常运行时间仍然是一样的:30分钟,或1小时34分钟……似乎在随机时刻冻结。 大部分在iPhone 4上(很less在模拟器或iPad上)

这可能与我的展示方式有关:

 + (NSTimeInterval)uptime:(NSNumber **)days hours:(NSNumber **)hours mins:(NSNumber **)mins { NSProcessInfo *processInfo = [NSProcessInfo processInfo]; //START UPTIME/////// NSTimeInterval systemUptime = [processInfo systemUptime]; // Get the system calendar NSCalendar *sysCalendar = [NSCalendar currentCalendar]; // Create the NSDates NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceNow:(0-systemUptime)]; unsigned int unitFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit; NSDateComponents *c = [sysCalendar components:unitFlags fromDate:date toDate:[NSDate date] options:0]; //NSString *uptimeString = [NSString stringWithFormat:@"%dd %dh %dmin", [c day],[c hour],[c minute]]; *days = [NSNumber numberWithInt:[c day]]; *hours = [NSNumber numberWithInt:[c hour]]; *mins = [NSNumber numberWithInt:[c minute]]; [date release]; //END UPTIME//////// return systemUptime; } 

在后面的代码中:

 NSNumber *uptimeDays, *uptimeHours, *uptimeMins; [CJGDevice uptime:&uptimeDays hours:&uptimeHours mins:&uptimeMins]; NSString *uptimeString = [NSString stringWithFormat:@"%@d %@h %@min", [uptimeDays stringValue], [uptimeHours stringValue], [uptimeMins stringValue]]; 

编辑:在iPad和iPhone上logging结果3天后,我可以看到,这个正常运行时间是错误的,时间运行得太慢了,我们越等待越是显而易见的,

这个方法有诀窍:

 - (time_t)uptime { struct timeval boottime; int mib[2] = {CTL_KERN, KERN_BOOTTIME}; size_t size = sizeof(boottime); time_t now; time_t uptime = -1; (void)time(&now); if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) { uptime = now - boottime.tv_sec; } return uptime; } 

感谢Alastair Stuart的链接 。

该方法是系统从启动以来已经清醒的时间(而不是真实世界的时间),iOS设备通常花费大量的时间睡眠。 这就是为什么它没有像你期望的那样增加。

资料来源: http : //developer.apple.com/library/ios/releasenotes/Cocoa/Foundation.html

看看达尔文的正常运行时间命令是如何实现的。 来源在这里 。

你想要读取的部分是pr_header()函数,特别是围绕这些行:

 if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) { uptime = now - boottime.tv_sec;