【发布时间】: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