背景资料
我正在开发一个连接到服务器的 iOS 应用程序,可以从设备向服务器发出请求,以将本地数据库与服务器的数据库同步。更改可能发生在任一数据库上。该应用程序还具有离线功能,用户可以在不连接到互联网连接的情况下修改数据,只有在线才能通过发送新数据并从服务器接收更新来同步设备的本地数据库与服务器的数据库。
更新了更多背景信息:处理的数据是必须在一定时间内完成的表格。它的启动时间作为模型的属性存储,并且使用该属性,应用程序向用户显示该表单被锁定之前还剩多少时间。
Problem
当设备离线时,用户可以操纵时间设置,这将使从该设备接收的数据不准确。
我已经寻找一种方法来检测设备时间设置的更改,但根据这个答案 https://stackoverflow.com/a/32457965/5363378,这似乎是不可能的,除非我的应用程序在后台运行,苹果对此非常严格,并且不允许,除非应用程序具有以下之一背景模式 https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html已启用,但在应用程序中不适用。
更新了更多信息:正如我在上面背景信息的更新部分中提到的,数据是可能有时间限制的形式。因此,用户可以在一台设备上启动表单,但不能在那里完成它。然后他们会将数据同步到服务器,跳转到另一个设备并完成相同的表格。
建议的解决方案
我最接近解决这个问题的方法是在安装应用程序时获取服务器时间和设备时间之间的差异(第一次打开应用程序时一定要在线,以便为此设备配置它) ),并且每当我想要存储与时间相关的值时都使用此差异作为参考。
如果服务器检测到时间差异,它将拒绝来自该设备的所有数据,这将迫使该设备恢复数据,更新时间差,然后才接受来自该设备的数据。
问题是,当设备离线时,用户可以更改时间设置,对数据进行更改,然后将时间设置恢复到上线之前的状态。然后,服务器将检测到时间设置没有变化,并将接受无效数据。
更新以添加另一个建议的解决方案:为了在下面的问题中详细说明我的注释以及 @Krypton 的评论,由于与上述解决方案相同的问题,设备的正常运行时间对我的情况没有多大帮助。
将设备的正常运行时间与服务器时间进行比较是完美的,直到用户重新启动设备。用户无法手动更改它,但是只需重新启动一次即可破坏所有内容,这会给我带来同样不准确的数据。修复它需要计算新的差异,这在设备离线时没有帮助。
问题
- 是否有一个不可更改的时间戳可以作为参考
保存与时间相关的值,使其不受
用户更改设备时间?一个例子是
自设备首次激活以来的时间。 (Note: 这
我最接近找到任何相关的是uptime的
设备,但这对我的情况没有多大帮助)
- 有没有一种方法可以知道当前时间而不需要
每当要保存与时间相关的值时就上网吗?
- 有没有办法解决我提出的解决方案,或者更好的解决方案
解决方案?