【发布时间】:2014-01-16 00:38:14
【问题描述】:
我的 iOS 应用需要一个始终与我的服务器时钟同步的自定义时钟。所有的同步逻辑都完成了。
我的时钟基于 mach_absolute_time(),您可以从中计算设备启动后经过的时间。问题是当设备进入睡眠模式时(通过按下屏幕锁定键并且没有应用程序在后台运行),马赫时间滴答声被暂停。当手机被唤醒时,马赫时间会继续计时,但它不会考虑手机已经睡着的时间。
这是我计算自启动以来经过的时间的方式(但它不会考虑设备处于睡眠状态的时间)
- (long long) elapsedTimeMillis {
uint64_t elapsedTimeNano = 0;
mach_timebase_info_data_t timeBaseInfo;
mach_timebase_info(&timeBaseInfo);
elapsedTimeNano = mach_absolute_time() * timeBaseInfo.numer / timeBaseInfo.denom;
return (long long)(elapsedTimeNano / 1000000);
}
这具有完全相同的结果:
- (long long) elapsedTimeMillis {
clock_serv_t cclock;
mach_timespec_t mts;
host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock);
clock_get_time(cclock, &mts);
mach_port_deallocate(mach_task_self(), cclock);
return mts.tv_nsec / 1000000 + mts.tv_sec * 1000;
}
NSDate、CFAbsoluteTimeGetCurrent() 等不是一个选项,因为它们会受到用户同步或手动更改的设备时间的影响。
有没有什么方法可以在 iOS 中从不会来回跳动的不间断滴答时钟获取时间?
【问题讨论】:
-
ios 基本上是一个unix 系统。它应该在某处有一个正常运行时间计数器,它是自启动以来经过的时间。那基本上只是“当前时间 - 启动时间”。可能没有您需要的准确度,但它应该始终可用。
-
@MarcB 你是对的,应该。但至少在带有 iOS7 的 iPhone 4s 中,它看起来像一个正常运行时间计数器(即 SYSTEM_CLOCK 或 mach_absulte_time()),不幸的是,当设备进入睡眠模式时会暂停滴答声。因此,如果您在启动时使用它来计算日期/时间,它将丢失自启动以来一直处于睡眠状态的所有秒数。
-
这对 iOS 来说是相当愚蠢的。我的 Android 手机保持实时
uptime计数,该计数反映自启动以来经过的时间,无论有多少时间用于睡眠/锁定。 -
@Zaph 您的解决方案对我不起作用,因为该时间基于电话时钟或“挂钟”。是的,用户可以更改该时钟的时间(不仅是时区)。还是谢谢。
-
@MarcB 终于让我找到了答案……我一直在谷歌搜索“ios 启动时间”,但谷歌搜索“ios 正常运行时间”就成功了;)(见我的回答)
标签: ios