离线时准确的时间检测

han*_*nad 10 time ios swift

背景资料

我正在开发一个连接到服务器的iOS应用程序,可以从设备向服务器发出请求,以使本地数据库与服务器的数据库同步.任何一个数据库都可能发生更改.该应用程序还具有脱机功能,用户可以在不连接到Internet连接的情况下修改数据,并且只能通过发送新数据和从服务器接收更新来联机以便将设备的本地数据库与服务器的数据库同步.

更新了更多背景信息:处理的数据是必须在一定时间内完成的表格.它的启动时间存储为模型上的属性,并使用所述属性,应用程序向用户显示锁定此表单之前剩余的时间.


问题

当设备离线时,用户可以操纵时间设置,这将使从该设备接收的数据不准确.

我已经搜索了一种方法来检测设备时间设置的变化但是根据这个SO答案,除非我的应用程序在后台运行,否则这似乎是不可能的,Apple非常严格,除非应用程序启用了其中一种后台模式,这些模式在应用程序中不适用.

更新了更多信息:正如我在上面背景信息的更新部分中提到的,数据是可能有时间限制的表格.因此,用户可以在一个设备上启动表单,但不能在那里完成.然后,他们将数据同步到服务器,跳转到另一个设备并完成相同的表单.


提出的解决方案

我最接近解决这个问题的方法是在安装应用程序时获得服务器时间和设备时间之间的差异(确保在第一次打开应用程序时联机以便为此设备配置它),并且每当我想存储与时间相关的值时,使用此差异作为参考.

如果服务器检测到时间差异,它将拒绝来自此设备的所有数据,这将强制设备恢复数据,更新时间差,然后才能从该设备接受数据.

问题是,当设备处于脱机状态时,用户可以更改时间设置,对数据执行更改,然后将时间设置恢复为上线前的状态.然后,服务器将检测到时间设置中没有变化,并接受无效数据.

更新以添加另一个建议的解决方案:要在下面的问题中详细说明我的注释,以及@Krypton的注释,由于与上述解决方案相同的问题,设备的正常运行时间对我的情况没有多大帮助.

将设备的正常运行时间与服务器时间进行比较是完美的,直到用户重新启动设备.它不是由用户手动更改的,但是只需要一次重启就可以破坏所有内容,这会为我产生相同的不准确数据.修复它需要计算新的差异,这在设备离线时无济于事.


问题

  1. 是否存在可更改的时间戳,可在保存与时间相关的值时用作参考,以使其不会受到用户更改设备时间的影响?这样的一个例子是自设备首次激活以来的时间.(注意:我最接近发现任何相关的是设备的正常运行时间,但这在我的情况下没有多大帮助)
  2. 有没有办法知道当前时间,而无需在每次与时间相关的值保存时上线?
  3. 有没有办法解决我提出的解决方案或更好的解决方案?

gna*_*729 0

您永远不能依赖两个具有相同时间的设备。我建议服务器应该使用递增的时间戳,如果您从带有服务器时间戳 X 的服务器获取数据,那么您应该记录本地更改的只是知道您的更改是“服务器时间戳之后的某个时间” X”,没有任何准确的时间。并且与您的设备认为更改发生的时间无关。如果服务器为您提供的信息带有今天的时间戳 11:20:47.003692,并且您进行了更改并且设备上的时间为 10:15:15:000000,则该更改不会在 10:15 进行,而是在 10:15 进行。 “服务器上 11:20:47.003692 之后”。