【问题标题】:iOS real monotonic clock other than mach_absolute_time()除了 mach_absolute_time() 之外的 iOS 真实单调时钟
【发布时间】: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


【解决方案1】:

这就是诀窍:

见:Getting iOS system uptime, that doesn't pause when asleep

- (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;
}

返回自上次启动以来的 SECONDS。设备睡眠不会影响它,手机时间同步或用户更改手机时间也不会影响它。不幸的是,它不返回毫秒或纳秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2014-10-15
    相关资源
    最近更新 更多