提问者:小点点

iOS模拟器时间戳或日期()问题?


言归正传-

  • 有一个工作正常的聊天应用程序。
  • 当用户发送消息时,我会将本地时间戳转换为GMT时间戳以保持国际同步,并将GMT存储在firebase服务器中。
  • 侦听器侦听新消息,接收此消息,将其转换回本地时间戳并刷新表视图。

一切都运转得天衣无缝,直到最近我注意到一个有趣的问题

  • 我在模拟器和真实设备之间聊天
  • 当真实设备从模拟器接收到聊天时,我会迅速做出响应例如,在一秒钟内,聊天被发送,所有内容都根据消息时间戳进行了正确的排序
  • 但是当模拟器从真实设备接收到聊天信息,并且我在一秒钟内从模拟器快速响应时,该聊天信息将插入到前一个聊天信息之前,而不是插入到前一个聊天信息之后

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

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

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

       //perform server write operation
}

共1个答案

匿名用户

我认为这里的最佳实践是,如果您的应用程序是时间戳敏感的,使用固定和稳定的时间戳源,将使用Firebase时间戳。

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

Real Time Database Timestamp和Timestamp的实现与Cloud Firestore的实现不同,但这里有许多文章和示例用于实现基于服务器的Timestamp。