【问题标题】:iOS simulator timestamp or Date() issue?iOS 模拟器时间戳或 Date() 问题?
【发布时间】:2020-06-20 08:43:09
【问题描述】:

切入正题-

  • 拥有一个运行良好的聊天应用程序。
  • 当用户发送消息时,我将本地时间戳转换为 GMT 保持国际同步的时间戳,我将 GMT 存储在 firebase 服务器。
  • 侦听器侦听新消息,接收此消息,转换 它返回本地时间戳并刷新表格视图。

一切都完美无缺,直到最近我发现一个有趣的问题

  • 我在模拟器和真机之间聊天
  • 当真机收到来自模拟器的聊天消息时,我赶紧 回复说在一秒钟内,聊天已发送,一切正常 根据消息时间戳正确排序
  • 但是当模拟器收到真机和我的聊天 从模拟器中快速响应,插入聊天 在上一条聊天消息之前,而不是在上一条聊天消息之后插入

我注意到我的代码和一切都很好。问题是,当我在模拟器上使用当前时间戳 Date() 时,它似乎 滞后了 11 - 15 秒(有时甚至会变化 30秒)在真实设备上使用 Date()。因此,当我立即从模拟器发送消息时,firebase 服务器上记录的时间戳平均滞后 20 秒,并且由于我的消息是根据时间戳排序的,因此它会将这条消息放在最后收到的消息之前,而实际上它应该在它之后。

这是一个已知的模拟器问题吗?我无法在另一台真实设备上测试它,因为我只有一个

func sendChatMessage() {
       let localDate = Date()
       let GMTTimestamp = getGMTTimestamp(localDate: localDate.timeintervalsince1970)
       let GMTTimestampFinal = Int64(GMTTimestamp)

       //perform server write operation
}

【问题讨论】:

  • 如果您的应用程序对时间戳敏感,您为什么首先使用设备生成的日期?该时间戳可能会偏离 - 如果设备没有更新到本地时间,或者他们关闭了该功能,或者他们只是出于其他原因更改了时间。为什么不使用 Firebase 服务器时间戳?
  • @Jay 嗨,Jay。我也是这么想的。所以firebase时间戳总是会记录firebase服务器的时间戳是吗?我该如何处理国际日期和东西?此外,我的应用程序完全编码为使用 timeintervalsince1970。会调查它,但会感谢任何建议
  • 嘿阿奇。 Firebase 服务器时间戳确实由服务器确定,并且处于固定时区。您通常希望获取该值并将其显示在应用程序代码中的用户时区中。
  • @FrankvanPuffelen - 谢谢弗兰克 - 我在考虑服务器时间戳,但它完全忽略了设备不稳定的想法。会这样做。您或 Jay 都可以将此作为答案发布,我会将其标记为正确答案。我猜这是合适的方法
  • 我会把这个留给杰伊,因为他想出了这个主意。 :)

标签: ios swift firebase ios-simulator


【解决方案1】:

我认为这里的最佳做法是,如果您的应用对时间戳敏感,则使用固定且稳定的时间戳源,该源将使用 Firebase 时间戳。

本地生成的日期或时间戳可能不稳定且不可预测;如果设备没有更新到本地时间,或者他们关闭了该功能,或者他们只是出于其他原因更改了时间。这可能会导致数据和排序顺序不准确。

Real Time Database TimestampTimestamp 的实现与 Cloud Firestore 不同,但这里有许多帖子和示例用于实现基于服务器的时间戳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2022-01-20
    • 2016-04-03
    • 1970-01-01
    • 2017-04-02
    • 2011-11-23
    相关资源
    最近更新 更多