【问题标题】:How can I reliably detect that an iOS device was rebooted?如何可靠地检测到 iOS 设备已重新启动?
【发布时间】:2020-03-08 09:36:33
【问题描述】:

我正在研究一种温和的反作弊解决方案,以抵消设备时间的变化。目标是通过使用设备正常运行时间来确定当前的 DateTime。当设备重新启动时,该值应与设备报告的任何内容同步。

它将组合在一个分层结构中,首先使用互联网时间(如果可用),然后是正常运行时间,最后是默认设备时间。

我所缺少的只是检测设备是否在应用会话之间重新启动的可靠方法。

我试过了:

  • 从内核获取引导时间。这不是一个选项,因为当设备时间改变时,启动时间会改变。
  • 在NSTemporaryDirectory() 中创建一个文件,并在应用启动时检查它是否存在。遗憾的是,该文件至少会保留 1 周,然后才会在重新启动时被删除。
  • 比较正常运行时间。在以下情况下,这可能会导致误报:
    在 14:00 启动应用程序,正常运行时间为 20 分钟 => 我确定启动时间为 13:40。
    在 15:00 启动应用程序,正常运行时间为 25 分钟 => 我无法确定用户是否在 14:35 重新启动了设备,或者是否在没有重新启动设备的情况下更改了时间。

我可以通过读取位于/proc/sys/kernel/random/boot_id 的文件的内容来检测Android 上的重启。它在每次启动时填充一个随机生成的 ID。我在 iOS 上找不到类似的东西。

我使用此代码检索正常运行时间/启动时间:

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;

【问题讨论】:

    标签: ios objective-c reboot


    【解决方案1】:

    比较正常运行时间。在以下情况下,这可能会导致误报:在 14:00 启动应用程序,正常运行时间为 20 分钟 => 我确定启动时间为 13:40。在 15:00 启动应用程序,正常运行时间为 25 分钟 => 我无法确定用户是否在 14:35 重新启动了设备,或者是否在没有重新启动设备的情况下更改了时间。

    如果您不能相信从系统获取的时间,请改为从外部来源获取。有关为此使用网络时间协议的建议,请参阅Get Date and Time from Apple Server。然后,您可以使用uptime 计算启动时间并将其与之前计算和存储的启动时间进行比较。

    【讨论】:

    • 我正在寻找不需要上网时间的解决方案,因为这是后备解决方案,正如我在原帖中提到的那样:“它将组合成一个分层结构,其中互联网时间将首先使用(如果可用),然后是正常运行时间,最后默认为设备时间。”
    猜你喜欢
    • 2012-10-19
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多