离线时准确检测时间

2024-02-14

背景资料

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

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


Problem

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

我已经寻找一种方法来检测设备时间设置的更改,但根据这个答案 https://stackoverflow.com/a/32457965/5363378,这似乎是不可能的,除非我的应用程序在后台运行,苹果对此非常严格,并且不允许,除非应用程序具有以下之一背景模式 https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html已启用,但在应用程序中不适用。

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


建议的解决方案

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

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

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

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

将设备的正常运行时间与服务器时间进行比较是完美的,直到用户重新启动设备。用户无法手动更改它,但是只需重新启动一次即可破坏所有内容,这会给我带来同样不准确的数据。修复它需要计算新的差异,这在设备离线时没有帮助。


问题

  1. 是否有一个不可更改的时间戳可以作为参考 保存与时间相关的值,使其不受 用户更改设备时间?一个例子是 自设备首次激活以来的时间。 (Note: 这 我最接近找到任何相关的是uptime的 设备,但这对我的情况没有多大帮助)
  2. 有没有一种方法可以知道当前时间而不需要 每当要保存与时间相关的值时就上网吗?
  3. 有没有办法解决我提出的解决方案,或者更好的解决方案 解决方案?

可以通过三种方式获取设备上的时间。

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

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

现在仍然存在重启设备的问题。如果您能够获取设备启动时间,您可以计算上次保存的时间之间的差异NSDate和启动时间。幸运的是,这是可能的。看这个答案 https://stackoverflow.com/a/24452263/5324371或任何其他可能的方法的答案。请注意,实施此操作可能会导致轻微(1-10 秒)的误差。

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

另外,NSSystemClockDidChangeNotification https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/#//apple_ref/c/data/NSSystemClockDidChangeNotification应该能够提供帮助。

编辑:这就是我要做的。请记住,这并不完美,无论您选择什么,都需要权衡。

当您有互联网连接时,您可以经常获取服务器时间并将其保存在模型中。这允许您计算设备时间和服务器时间之间的时间差。您可以通过保存来做到这一点uptime and NSDate作为模型中的时间戳。如果设备尚未重置,请使用uptime。计算NSDate引导(see here https://stackoverflow.com/a/24452263/5324371),然后重新开始测量。如果这些差异发生显着变化,您就知道时间已被篡改。请记住这些差异will即使用户没有更改时间(测量错误、夏令时...)。您的考虑很大程度上取决于您的应用程序。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

离线时准确检测时间 的相关文章

  • SwiftUI 列表与右侧的部分索引?

    是否可以有一个在右侧有索引的列表 就像下面 SwiftUI 中的示例一样 我在 SwiftUI 中做了这个 Contacts swift TestCalendar Created by Christopher Riner on 9 11 2
  • 如何在IOS中的UIStackView中设置权重

    UIStackView与安卓类似LinearLayout但我不知道如何设置子视图的权重 假设我有一个垂直的UIStackView and 3 UIImageView就在里面 我想连续设置权重3 6 1UIImageViews 我怎么做 UI
  • XMPPFramework - 如何创建多用户聊天室?

    我如何使用XMPPFramework在iPhone中实现GroupChat 我尝试了以下代码 但房间没有创建 我如何知道房间是否创建 XMPPRoomDelegate没有被调用 当Stream断开连接时 调用handleDidLeaveRo
  • 打乱 NSMutableArray 而不重复并显示在 UIButton 中

    在我看来 我有 12 个按钮 一个数组包含 6 个名称 我想在其中打印数组名称UIButton标题 这是我的代码 texts NSMutableArray alloc initWithObjects 1 2 3 4 5 6 nil UIBu
  • 网站在 iPhone 屏幕右侧显示空白区域

    我遇到问题http eiglaw com http eiglaw com iPhone 屏幕右侧显示约 25 像素宽的空白 边框 我在 stackoverflow 上研究了这个问题 这些帖子是相关的 但是当我尝试提供的各种解决方案时 我无法
  • 在没有预览窗口的情况下使用 AVCaptureVideoDataOutputSampleBufferDelegate

    我正在开发一个基于 Swift 的 macOS 应用程序 我需要捕获视频输入 但不将其显示在屏幕上 而不是显示视频 我想将缓冲的数据发送到其他地方进行处理 并最终显示它在 a 中的一个物体上SceneKit scene 我有一个Camera
  • 在 WKWebView 中禁用放大手势

    我正在寻找一种方法来禁用 WKWebView 的 iOS 实现上的 捏合缩放 放大手势 OS X 有一个 magnification BOOL 属性 但在 iOS 上似乎不可用 WKWebView h if TARGET OS IPHONE
  • 在横向中自动调整 UITableCells 内容的大小

    在 UITableView 中 我通过 UILabels 将内容添加到单元格中 定义最佳尺寸 与单元格宽度允许的一样大 我注意到只有tableView contentSize width是可靠的 因为cell contentView bou
  • 如何使用 NSUserDefaults 在 Swift 中存储自定义类的数组?

    我有一个名为的自定义类Person当某人输入信息时 它会存储有关某人的各种属性 class Person Person dictionary variable var name String var age String var html
  • 从“NSPercientStoreResult”转换为不相关类型“Entity”总是失败

    我正在创建一个小应用程序来学习 CoreData 中的多对多关系 但是 使用下面的代码 从 NSFetchResult 到实体类 Groepering 的转换出现错误 与我的项目相比 我在互联网上找到的示例没有看到任何差异 为什么转换仍然失
  • UIScrollView setZoomScale 将应用的旋转设置回零

    我已经从事地图替换工作很长一段时间了 整个事情的工作原理是UIScrollView由一个支持CATiledLayer 为了旋转我的地图 我旋转图层本身 使用CATransform3DMakeRotation 到目前为止效果很好 但如果我打电
  • 当我输入字符时,SwiftUI 中的 TextField 失去焦点

    当我在文本字段中输入字符时遇到问题 在练习集视图 我必须重新单击文本框才能输入另一个字符 如果我从文本字段中删除绑定 我可以流畅地输入文本 我认为这与我的演讲者班级和更新集函数重新创建一个集合实例 因为我必须替换数组中两层深处的一些值 Co
  • 是否可以使用 Firebase 安排推送通知? [复制]

    这个问题在这里已经有答案了 我已经阅读了我能找到的所有文档 但仍然不知道这是否可行 如果我是用户 我可以安排特定时间的推送通知吗 Example 1 我是用户并打开应用程序 2 我允许通知并转到 pickerView 或其他任何内容 并设置
  • 在 Xcode 5 中重命名 iOS 项目[重复]

    这个问题在这里已经有答案了 我需要重命名一个 iOS 项目 有没有办法在不开始一个全新项目的情况下做到这一点 我发现的所有其他信息都与 Xcode 4 或旧版本相关 这些方法似乎使项目崩溃 我在尝试任何名称更改之前创建了一个快照 在 Xco
  • 在 Swift 中从 UIScrollView 创建 PDF 文件

    我想从 UIScrollView 的内容创建一个 PDF 文件 func createPdfFromView aView UIView saveToDocumentsWithFileName fileName String let pdfD
  • 如何接收有关与我共享的记录中所做更改的 CloudKit 通知?

    我有两个 iCloud 帐户 A and B 在两个不同的设备上 来自其中之一 A 我将 ckrecord 分享给另一个人 B 像这样 let controller UICloudSharingController controller p
  • 减少 CoreData 的调试输出?

    我正在开发一个使用 CoreData 的 iOS macOS 项目 它工作正常 但它会向控制台输出大量调试信息 这使得控制台无法使用 因为我的打印语句隐藏在所有与 CoreData 相关的内容中 我有一个非常简单的 CoreData 设置
  • AVAssetExportSession 为零 iPhone 7 - Plus 模拟器

    AVAssetExportSession在 iPhone 6 及以下版本上运行良好 但在 iPhone 7 iPhone 7 Plus 模拟器上运行不佳 Xcode 8 0 这段代码return nil在exportSession中 当在i
  • 如何让按钮闪烁?

    我试图在扫描正确时将按钮的颜色 只是闪烁 闪烁 更改为绿色 在出现问题时将按钮的颜色更改为红色 我可以用这样的视图来做到这一点 func flashBG UIView animateWithDuration 0 7 animations s
  • iOS - UITableViewCell 使文本加粗

    我有一个字符串 NSString userInfo James Johnson james 我想做的就是大胆James Johnson并保留 james正常字体 所以我尝试过的是使用NSAttributedString但为了完成这个过程 我

随机推荐