gpt4 book ai didi

ios - 当设备在 iOS 7 上进入休眠状态时,clock_get_time/mach_absolute_time 停止更新

转载 作者:可可西里 更新时间:2023-11-01 04:46:51 26 4
gpt4 key购买 nike

我的应用程序使用 mach_absolute_time 计算自上次触摸事件以来的滴答声,并在超过 10 分钟的空闲时间限制时将用户注销。

这在 iOS 6 上一切正常,但我注意到它在 iOS 7 上表现不正确。具体来说,当 iOS 7 设备拔下电源(使用电池)时,设备似乎停止增加其滴答声按照控制台中的这一行进入休眠状态(这会在大约 5 分钟不活动后发生):

powerd[47] : Sleep: Using BATT (Charge:99%)

因此,当我在 10 分钟后唤醒设备并使用 mach_absolute_time 计算滴答时,差异显示只有 5 分钟(实际上,已经过去了 10 分钟)。

奇怪的是,当设备插入电源时,一切正常,滴答声继续运行。它从不显示设备在插入时将在控制台日志上休眠(尽管屏幕确实关闭并且行为在视觉上与拔下时相同)。

我也使用 clock_get_time 尝试过,但我也遇到了同样的问题。

我可以在 iOS 7 中做些什么来在设备进入休眠状态时保持 Mach 绝对时间滴答作响?我不想使用 [[NSDate date] timeIntervalSince1970],因为用户可以操纵系统时间并绕过它。

感谢任何见解。

最佳答案

事实证明,mach_absolute_time() 的默认行为是在设备进入休眠状态后停止计时。在 iOS 6 上,当使用 beginBackgroundTaskWithExpirationHandler 将应用程序置于后台时,我能够将暂停时间延长 10 分钟。然而,在 iOS 7 中,允许的最长时间限制为 3 分钟(通过调用 backgroundTimeRemaining 发现)。这就是为什么我看到时钟在 iOS 7 上停止,但在 iOS 6 上却没有。

偶然发现this answer今天,这似乎很有希望。

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

time() carries on incrementing while the device is asleep, but of course can be manipulated by the operating system or user. However, the Kernel boottime (a timestamp of when the system last booted) also changes when the system clock is changed, therefore even though both these values are not fixed, the offset between them is.

关于ios - 当设备在 iOS 7 上进入休眠状态时,clock_get_time/mach_absolute_time 停止更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19817867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com