我正在尝试使用XMPP构建聊天应用。它工作正常。但是,我发现当我收到其他人的离线消息时,我的聊天列表变得混乱。这是因为离线消息的时间戳是按服务器时间存储的,服务器时间与设备的时间不同。所以你能告诉我如何调整我从服务器或其他解决方案中解决这个问题的时间,非常感谢!!
答案 0 :(得分:3)
如果您遇到与我相同的问题,我会找到答案,并在此与您分享我的解决方案。在XMPP中,我们有两个扩展:XEP-0202 XMPPAutoTime和XEP-0136 XMPPMessageArchiving。
当我们在appDelegate中使用XMPPMessageArchiving时,消息(无论是在线还是离线)都将存储到核心数据中。如果消息是脱机消息,则时间戳将是服务器的时间。某些设备的时钟可能与服务器不同。我们可以使用XMPPAutoTime来处理设备时钟和服务器时钟之间的延迟。
在XMPPMessageArchivingCoreDataStorage.m中可以找到一个名为
的函数 - (void)archiveMessage:(XMPPMessage *)message outgoing:(BOOL)isOutgoing xmppStream:(XMPPStream *)xmppStream
并在此函数中找到以下代码:
if (timestamp)
archivedMessage.timestamp = timestamp;
else
archivedMessage.timestamp = [[NSDate alloc] init];
这里,这些代码处理存储到核心数据的消息时间戳。我们使用“XMPPAutoTime”调整离线消息时间戳
if (timestamp){
NSTimeInterval timeDiffer = [[self appDelegate].xmppAutoTime timeDifference];
timestamp = [NSDate dateWithTimeInterval: - timeDiffer sinceDate:timestamp];
archivedMessage.timestamp = timestamp;
}
else
archivedMessage.timestamp = [[NSDate alloc] init];
这对我有用。 (当然你必须导入AppDelegate并在AppDelegate中设置xmppAutoTime)
答案 1 :(得分:0)
我遇到了类似的问题,以保持用户的项目同步。我所做的是保持服务器和客户端之间的时差。
在能够向服务器发送数据之前,客户端请求服务器的时间戳。然后它保持时间偏移。这是我的代码(responseObject是一个包含从服务器获取数据的字典)。
NSTimeInterval serverTimestamp = [[responseObject valueForKey:@"timestamp"] unsignedIntegerValue];
NSTimeInterval appTimestamp = [[NSDate date] timeIntervalSince1970];
[self setServerTimeOffset:(serverTimestamp - appTimestamp)];
然后,当我发出请求时,我会计算服务器时间戳:
- (NSDate *)serverDate {
return [[NSDate date] dateByAddingTimeInterval:_serverTimeOffset];
}