我有一个应用程序要求我在一段时间后采取行动。例如,如果用户几周没有进入该应用程序,那么当用户最终启动该应用程序时,我必须要求他们输入安装该应用程序时提供给他们的特殊代码。(这是一个内部应用程序,出于安全考虑,我被要求这样做)

我正在使用 [NSDate date] 方法来检索用户登录时的日期并将其保存到数据库中。我会在他们下次打开应用程序时比较这个保存的日期,看看自上次登录以来已经过去了多长时间。问题是 [NSDate date] 给出的时间受到用户可以在本机设置应用程序中手动更改的时间设置的影响。正如您可能知道的那样,这给我的处境带来了很多问题。如果用户应该在 3 周不活动后输入特殊代码,他可以通过修改本机设置应用程序中的时间来使应用程序显示此屏幕,或者更糟糕的是,通过将时间设置为之前的日期来摆脱它这将是他活动后的三周内。

有没有办法获取“系统时间”而不是“用户时间”?我已经研究过 mach_absolute_time() 但在设备重新启动后会重置。由于我要比较的不活动时间相当长,因此到那时设备很可能已经重新启动。我还考虑过使用网络连接从应用程序外部的服务器获取时间,但很多用户在使用 iPad 时无法访问 wifi。如果我找不到其他任何东西,这将是我最后的解决方案。由于它们在使用过程中的位置,我尝试使用设备本身上的所有内容。

我在这里忽略了一些简单的事情吗?这似乎是一个太简单的问题,没有答案。请引导我走向正确的方向。先感谢您。

有帮助吗?

解决方案

为什么不查询远程服务器的时间 - 有很多 NTP 服务器,或者只是向您自己的服务器上的 php 脚本发出一个简单的 HTTP 请求。当然,如果您的应用程序可能永远不会连接到互联网,这可能是一个问题,但是一旦您有了第 3 方时间,就很容易猜测用户是否一直在玩时钟。

其他提示

如果这是一个内部应用程序(因此您不受苹果批准流程的限制),您可以将您的应用程序标记为执行一些后台操作(VoIP 或接收位置更新),以便该应用程序将始终处于活动状态,并且您可以能够更新某种“未使用”的计数器。设备重启后,操作系统甚至会重新启动 Voip 应用程序。

但当然它会稍微耗尽电池电量。

任何一个:让实际时间成为您应用程序的基本功能。这样用户就需要保持设备的时间是最新的并且不能回退三周

或者:将代码标记为过期,并在应用通知用户之前保存此信息。这将阻止大多数用户重新设置时间。大多数人会尝试一两次,看到应用程序保持禁用状态并会放弃。

您还可以保存上次成功执行的时间戳,如果这超出了未来的合理时间范围(记住夏季/冬季时间),则将其视为“黑客尝试”。在该时间戳上进行 CRC 检查(或者您想出的任何晦涩的想法)并保存它,您将阻止大量脚本小子。

你永远无法阻止顽固的黑客,他们会积极搜索你可能在应用程序中使用的每一个技巧。只关注“普通”用户。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top