2014-04-08 97 views
0

在使用藍牙連接(GameKit,特別是iOS6兼容性)的服務器 - 客戶端遊戲中,一個或多個客戶端設備(iPhone/iTouch)向服務器設備(iPad)發送時間戳,當每個客戶端上的按鈕被點擊時。即每個客戶端呼叫:導致不同時間間隔的同步NSDate生成

[[NSDate date] timeIntervalSince1970] 

...然後將值作爲NSData有效載荷發送到服務器。

當只有1個客戶端連接時,生成併發送到服務器的時間與物理分接時間相同。當連接兩個或多個客戶端時,即使所有客戶端完全同時點擊,所產生的時間也會有很大差異,例如,

客戶端1和2同時抽頭:

  • 客戶機1個時間戳= 1396974546.558433(自1970年以來的時間間隔)
  • 客戶端2時間戳= 1396974551.274747(自1970年以來的時間間隔)

即客戶2從客戶端1以5秒爲單位。雖然我接受幾毫秒的差異,但由於真正的同時攻絲很困難,因此多秒鐘是不可接受的。添加額外的客戶端在時間上產生或多或少的隨機差異,但通常幾秒鐘。

爲了使事情變得更加神祕,正在生成的時間戳不同客戶上:在服務器接收的時間戳是相同由客戶端生成(即它不是發生在運輸途中或在收據)。

我不知道是什麼原因造成的。有任何想法嗎?

+0

轉到兩個客戶端的主屏幕並觀看時鐘應用程序圖標。第二隻手是同步還是關閉了5秒? – rmaddy

回答

0

[[NSDate date] timeIntervalSince1970]與設備上設置的時間有關,因此您不能依靠兩臺設備向您的服務器發送同一時間。

我使用Multipeer連接開發的東西時,也有類似的問題,並最終使用一種叫做ios-ntp庫,它使用從多個NTP服務器的時間信息與請求本身獲得準確的時間的延遲一起。它對我來說工作得很好。

0

我的猜測將是設備,無論出於何種原因,關閉的除了5秒

我之所以這麼說,是,

[[NSDate date] timeIntervalSince1970] 

通常有亞毫秒級精度

+0

是的,你說得對。根據ChrisH的回答,設備上的時鐘未同步。我用ios-ntp縮小了差距,儘管它並不完美。 – user2709279