如何可靠地检测到iOS设备已重新启动?
我正在研究一种温和的防作弊解决方案,以抵消设备时间的变化。目标是通过使用设备正常运行时间来确定当前日期时间。当设备重新启动时,该值应与设备报告的内容同步 它将以分层结构组合在一起,首先使用互联网时间(如果可用),然后使用正常运行时间,最后默认为设备时间 我所缺少的只是一种可靠的方法来检测设备是否在应用程序会话之间重新启动 我试过:如何可靠地检测到iOS设备已重新启动?,ios,objective-c,reboot,Ios,Objective C,Reboot,我正在研究一种温和的防作弊解决方案,以抵消设备时间的变化。目标是通过使用设备正常运行时间来确定当前日期时间。当设备重新启动时,该值应与设备报告的内容同步 它将以分层结构组合在一起,首先使用互联网时间(如果可用),然后使用正常运行时间,最后默认为设备时间 我所缺少的只是一种可靠的方法来检测设备是否在应用程序会话之间重新启动 我试过: 从内核获取引导时间。这不是一个选项,因为当设备时间改变时,引导时间会改变 在NSTemporaryDirectory()中创建一个文件,并在应用程序启动时检查该文件
- 从内核获取引导时间。这不是一个选项,因为当设备时间改变时,引导时间会改变
- 在
中创建一个文件,并在应用程序启动时检查该文件是否存在。不幸的是,在重新启动时删除该文件之前,该文件至少会保留一周NSTemporaryDirectory()
- 比较正常运行时间。这可能会导致以下情况下的假阳性:
在14:00启动应用程序,正常运行时间为20分钟=>我确定启动时间为13:40。
15:00启动应用程序,正常运行时间为25分钟=>我无法确定用户是在14:35重新启动设备,还是在没有重新启动设备的情况下更改了时间
/proc/sys/kernel/random/boot_id
的文件内容,我能够检测到Android上的重启。它在每次启动时都会填充一个随机生成的ID。我在iOS上找不到类似的东西
我使用以下代码检索正常运行时间/引导时间:
struct timeval引导时间;
int mib[2]={CTL_KERN,KERN_BOOTTIME};
size\u t size=sizeof(引导时间);
现在是时候了;
正常运行时间=-1;
(作废)时间(&现在);
if(sysctl(mib,2,&boottime,&size,NULL,0)!=1&&boottime.tv_sec!=0)
{
正常运行时间=现在-boottime.tv_秒;
}
返回正常运行时间;
比较正常运行时间。在以下情况下,这可能会导致误报:在14:00启动应用程序,正常运行时间为20分钟=>我确定启动时间为13:40。15:00启动应用程序,正常运行时间为25分钟=>我无法确定用户是在14:35重新启动设备,还是在没有重新启动设备的情况下更改了时间
如果您不能信任从系统中获得的时间,请改为从外部来源获得。有关使用网络时间协议的建议,请参阅。然后,您可以使用uptime
计算启动时间,并将其与之前计算和存储的启动时间进行比较
比较正常运行时间。在以下情况下,这可能会导致误报:在14:00启动应用程序,正常运行时间为20分钟=>我确定启动时间为13:40。15:00启动应用程序,正常运行时间为25分钟=>我无法确定用户是在14:35重新启动设备,还是在没有重新启动设备的情况下更改了时间
如果您不能信任从系统中获得的时间,请改为从外部来源获得。有关使用网络时间协议的建议,请参阅。然后,您可以使用
正常运行时间
计算启动时间,并将其与之前计算和存储的启动时间进行比较。我正在寻找一种不需要internet时间的解决方案,因为这是回退解决方案,正如我在原始帖子中提到的:“它将以分层结构组合在一起,首先使用internet时间(如果可用),然后使用正常运行时间,最后默认为设备时间。”我正在寻找一种不需要internet时间的解决方案,因为这是回退解决方案,正如我在原始帖子中提到的:它将以分层结构组合在一起,首先使用互联网时间(如果可用),然后使用正常运行时间,最后默认为设备时间。”