gpt4 book ai didi

ios - 离线时准确的时间检测

转载 作者:IT王子 更新时间:2023-10-29 05:37:32 24 4
gpt4 key购买 nike

背景资料

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

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

问题

当设备处于离线状态时,用户可以操纵时间设置,这会使从该设备接收到的数据不准确。

我已经搜索了一种方法来检测设备时间设置的更改,但根据 this SO answer ,除非我的应用程序在后台运行,否则这似乎是不可能的,Apple 对此非常严格,除非应用程序具有 background modes 之一,否则不允许这样做启用,这在应用程序中不适用。

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

建议的解决方案

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

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

问题在于,当设备离线时,用户可以更改时间设置,对数据进行更改,然后将时间设置恢复为上网前的状态。然后,服务器将检测到时间设置没有变化,并将接受无效数据。

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

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

问题

  • 是否有一个不可更改的时间戳可以作为引用
    保存与时间相关的值,使其不受
    用户对设备时间的更改?这方面的一个例子是
    自设备首次激活以来的时间。 ( :
    我最接近找到任何相关的是正常运行时间
    设备,但这对我的情况没有多大帮助)
  • 有没有办法知道当前时间而无需
    每当要保存与时间相关的值时就联机?
  • 有没有办法解决我提出的解决方案,或者更好
    解决方案?
  • 最佳答案

    有三种方法可以获取设备上的时间。

  • NSDate .用户可以修改的时间。
  • mach_absolute_time .这是设备的绝对时间。但正如您所指出的,这会破坏设备重启时的一切。此外,当设备暂停时,这将变得不正确。
  • 开机时间。自启动以来的时间。使用uptime得到这个。

  • 您将需要使用 NSDate 的组合。和 uptime .也许您可以在对表单进行的任何更改上保存两者的时间戳。您将能够计算这些更改值之间的任何差异,并为您的应用程序进行必要的计算。如果可能,您可能还想保存并与服务器时间进行比较。

    现在仍然存在重新启动设备的问题。如果您能够获取设备启动的时间,您可以计算您上次保存的 NSDate 之间的差异。和开机时间。幸运的是,这是可能的。见 this answer或任何其他可能的方法的答案。请注意,执行此操作可能会导致小的(1-10 秒)不准确。

    另一种选择是在设备重启后不允许应用程序在没有互联网连接的情况下启动。

    此外, NSSystemClockDidChangeNotification 应该能够提供帮助。

    编辑:这就是我将如何做到这一点。请记住,这并不完美,无论您选择什么,都会有取舍。

    当您有互联网连接时,您可以每隔一段时间获取服务器时间并将其保存在模型中。这允许您计算设备时间和服务器时间之间的时间差。您可以通过保存 uptime 来做到这一点。和 NSDate作为模型中的时间戳。如果设备尚未重置,请使用 uptime .计算 NSDate启动( see here),然后再次开始测量。如果这些差异发生显着变化,您就知道时间已被篡改。请记住,即使用户不更改时间(测量错误、夏令时......),这些差异也会改变。您考虑的内容很大程度上取决于您的应用程序。

    然后你必须决定如果时间改变了你想做什么。您可以考虑计算所用时间是否不超过最大值(如果设备尚未重置,请使用 uptime)或者可能完全放弃更改。

    关于ios - 离线时准确的时间检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34627791/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com