同时生成NSDate会导致不同的时间间隔

时间:2014-04-08 16:46:12

标签: ios objective-c bluetooth nsdate gamekit

在使用蓝牙连接的服务器 - 客户端游戏(GameKit,特别是iOS6兼容性)中,当每个客户端上的按钮被点击时,一个或多个客户端设备(iPhone / iTouch)向服务器设备(iPad)发送时间戳。即每个客户呼叫:

[[NSDate date] timeIntervalSince1970]

...然后将值作为NSData有效负载发送到服务器。

当仅连接一个客户端时,生成并发送到服务器的时间与物理点击的时间相同。当连接2个或更多客户端时,即使所有客户端都在完全相同的时间点击,生成的时间也会有很大差异,例如

客户端1和2同时点击:

  • 客户1时间戳= 1396974546.558433(自1970年以来的时间间隔)
  • client 2 timestamp = 1396974551.274747(自1970年以来的时间间隔)

即。客户端2在某种程度上是从客户端1出来的5秒钟。虽然我接受了几毫秒的差异,因为真正的同步攻丝很难,多秒是不可接受的。添加其他客户端会产生或多或少的随机时间差异,但通常会产生几秒钟。

为了使事情更加神秘,时间戳在客户端上以不同的方式生成:服务器上接收的时间戳与客户端生成的时间戳相同(即'不是在运输途中或收货时发生的事情。

我因为导致这种情况而感到茫然。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我的猜测是,无论出于什么原因,这些设备相隔5秒钟

我之所以这样说是

[[NSDate date] timeIntervalSince1970]

通常具有亚毫秒精度

答案 1 :(得分:0)

[[NSDate date] timeIntervalSince1970]与设备上设置的时间有关,因此您不能依赖两台设备同时向服务器发送。

在使用Multipeer Connectivity开发内容时我遇到了类似的问题,最后使用了一个名为 ios-ntp 的库,该库使用来自多个NTP服务器的时间信息以及请求本身的延迟得出准确的时间。这对我来说非常好。