我正在研究一种温和的防欺诈解决方案,以抵消设备时间的变化。目的是通过使用设备正常运行时间来确定当前的DateTime。重新启动设备后,该值应同步到设备报告的任何值。
它将以分层结构进行组合,其中将首先使用互联网时间(如果有),然后使用正常运行时间,最后默认为设备时间。
我所缺少的是一种在两次应用会话之间检测设备是否重启的可靠方法。
我尝试过:
NSTemporaryDirectory()
中创建文件,并在应用启动时检查它是否存在。不幸的是,该文件会保留至少1周,然后在重新启动时将其删除。通过读取位于/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;
比较正常运行时间。在以下情况下,这可能导致误报:在14:00启动应用程序,正常运行时间为20min =>我确定启动时间为13:40。在15:00启动应用程序,正常运行时间为25分钟=>我无法确定用户是否在14:35重新启动了设备,或者是否在不重新启动设备的情况下更改了时间。
如果您不信任从系统获取的时间,请从外部来源获取。有关为此使用网络时间协议的建议,请参见Get Date and Time from Apple Server。然后,您可以使用uptime
计算启动时间,并将其与先前计算和存储的启动时间进行比较。