言归正传-
一切都运转得天衣无缝,直到最近我注意到一个有趣的问题
我注意到我的代码和一切都很好。 问题是,当我在模拟器上使用当前的时间戳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
}
我认为这里的最佳实践是,如果您的应用程序是时间戳敏感的,使用固定和稳定的时间戳源,将使用Firebase时间戳。
本地生成的日期或时间戳可能是不稳定和不可预测的; 如果设备在任何地方都没有更新到本地时间,或者他们关闭了该功能,或者他们只是因为其他原因更改了时间。 这可能导致数据和排序顺序不准确。
Real Time Database Timestamp和Timestamp的实现与Cloud Firestore的实现不同,但这里有许多文章和示例用于实现基于服务器的Timestamp。