背景信息
我正在开发一个连接到服务器的iOS应用程序,设备可以向服务器发出请求,以便将本地数据库与服务器数据库进行同步。两个数据库中的任何一个都可能发生更改。该应用程序还具有脱机功能,其中用户可以在未连接互联网的情况下修改数据,并且只有在在线状态下,通过向服务器发送新数据并从服务器接收更新,才能将设备的本地数据库与服务器的数据库进行同步。
添加更多背景信息:处理的数据是必须在一定时间内完成的表格。开始时间存储为模型的属性,并使用该属性,应用程序向用户显示在此表格被锁定之前剩余的时间。
问题
当设备处于脱机状态时,用户可以操纵时间设置,这将使从该设备接收的数据不准确。
我已经搜索了一种检测设备时间设置更改的方法,但根据这个SO答案,除非我的应用程序在后台运行,否则似乎无法实现,而苹果公司对此非常严格,并且不允许除非应用程序启用了其中一个后台模式,但这些后台模式在该应用程序中不适用。
添加更多信息:正如我在背景信息的更新部分中提到的那样,处理的数据是可以有时间限制的表格。因此,用户可以在一个设备上开始一张表格,但不能在那里完成它。然后他们将数据同步到服务器,跳转到另一个设备并完成相同的表格。
建议解决方案
我已经接近解决这个问题,即在安装应用程序时获得服务器时间和设备时间之间的差异(第一次打开应用程序时一定在线以配置该设备),并在存储与时间相关的值时使用此差异作为参考。
如果服务器检测到时间差异,它将拒绝来自该设备的所有数据,这将迫使设备恢复数据、更新时间差异,然后才能接受来自该设备的数据。
问题在于,当设备离线时,用户可以更改时间设置,对数据进行更改,然后在联网前将时间设置返回到之前的状态。然后,服务器将检测不到时间设置的更改,并接受无效数据。
更新以添加另一个提出的解决方案:为了更详细地阐述下面的问题和与 @Krypton 的评论,设备的正常运行时间对我的情况没有太大帮助,因为与上述解决方案存在相同的问题。
将设备的正常运行时间与服务器时间进行比较是完美的,直到用户重新启动设备。它不能由用户手动更改,但只需要一次重新启动就可以破坏所有内容,这会为我产生相同的不准确数据。要修复它,需要计算新差异,这在设备离线时无法帮助。
问题
- 是否有一个不可更改的时间戳可以用作参考,以保存与时间相关的值,以便用户更改设备时间时不会受到影响?例如,设备首次激活以来的时间。(注意:我找到的与此相关的最接近的内容是设备的正常运行时间,但在我的情况下并不太有用)
- 是否有一种方法可以知道当前时间,而无需每次保存与时间相关的值时都需要联网?
- 是否有修复我提出的解决方案或任何更好的解决方案的方法?