【发布时间】: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