2012-07-10 73 views
1

我正在開發用於iPod Touch的iOS應用程序,其中我的應用程序始終顯示服務器時間。通過向服務器發起Web服務調用,每當應用程序進入前臺時,我總是將應用程序時間與服務器時間同步。如果我的服務器和客戶端之間的連接丟失幾個小時,我將無法同步應用程序時間。我讀的iOS不支持運行的定時器,當應用程序在後臺比下面提到的一些有限的情況下,其他:在iOS應用程序中計算時間間隔

  • 應用程式播放音頻內容給用戶,同時在後臺運行,如音樂播放器應用程序
  • 應用程序,使用戶在任何時候他們的位置的通知,如導航應用
  • 應用,支持互聯網語音協議(VoIP)
  • 需要下載和處理新的內容,收到
  • 應用報亭應用定期更新外部輔助功能ssories

那麼我該如何跟蹤申請時間?每當用戶切換到我的應用程序時,他都需要查看服務器時間,以便我需要運行計時器來更新上次同步的服務器時間。

回答

0

當應用程序進入後臺時,您可以存儲NSDate。當它恢復時,再次獲取當前的NSDate,並將差異添加到存儲的服務器時間。

+0

嗨喬希,我採用這種方法,並開始面臨問題,當用戶改變設備的時間。 – Cooldude 2012-07-10 02:08:29

+0

有一個在[我如何本地檢測iPhone時鐘的進步?](http://stackoverflow.com/questions/7122216/how-can-i-locally-detect-iphone-clock-advancement-by-a-user -between-app-runs) – 2012-07-10 02:12:17

0

你根本不需要計時器。

我會建議,當你與你的服務器同步時,你有它返回當前的UNIX時間戳。你可以這樣做:

[[NSDate date] timeIntervalSince1970]; 

...獲取設備當前的UNIX時間戳。那麼你可以做的是存儲這兩個時間戳之間的差異。這是服務器時間和設備時間之間的時鐘偏差。

您現在可以通過獲取設備的當前UNIX時間戳並向其添加時鐘偏差來計算服務器的大致時間。顯示它時調整時區(如果您需要),然後完成。無論何時與服務器同步時間,都可以刷新存儲的時鐘偏移值。

如果您想要看中,還可以在確定時鐘偏差時嘗試測量並考慮網絡延遲。

這種方法應該比嘗試存儲服務器的絕對時間戳記更好,然後使用定時器(或任何其他機制)跟蹤已經過了多長時間。

+0

如果我們採用這種方法,則應用程序時間將不可靠,因爲用戶可以在任何時間更改其設備時間,然後整個邏輯崩潰。 – Cooldude 2012-07-10 02:12:23

+0

檢查Josh Caswell的回答。當然,處理每個可能的邊緣情況都是不可能的。如果系統管理員(甚至只是NTP守護進程)更改服務器的時間會怎麼樣?這會導致同樣的問題。 – aroth 2012-07-10 02:16:26

+0

基於應用程序上顯示的TIME將用作我的應用程序的所有用戶操作的參考,以將這些更改同步到服務器。所以我希望它考慮所有可能的情況。感謝您的建議。 – Cooldude 2012-07-10 02:55:02

1

其他答案的組合,負責獲取服務器時間保持最後一次申請被同步到使用NSDate* lastSyncapplicationDidBecomeActive組合的服務器創建一個類。例如:

-(void)applicationDidBecomeActive:(UIApplication*)application { 
    [ServerTimeSync sharedInstance] resync]; 
} 

ServerTimeSync將保持NSDate*屬性與上次同步時間(你要轉換一下服務器爲您提供了一個NSDate*)。

+0

嗨喬,我願意依靠設備時間,因爲它可以在任何時間點由用戶改變。 – Cooldude 2012-07-10 02:13:57

+0

儘管有其他關於服務器時間變化的評論,但您可以將NSSystemClockDidChangeNotification的觀察者添加到ServerTimeSync類並作出相應的反應。不幸的是,如果任務在後臺被暫停,我懷疑這會傳遞給你。 – Joe 2012-07-10 02:40:47

+0

@Cdudude - 如果用戶更改時間並且您的應用程序被暫停,應該無關緊要。當您的應用程序變爲活動狀態時,您可以與服務器同步。不要反套。 – 2012-07-10 02:46:40