2009-09-24 106 views
6

我有一個iPhone應用程序,需要立即更新服務器進行更新。我怎樣才能讓服務器將數據「推送」到iPhone而不是iPhone不斷地輪詢Web服務?避免iPhone不斷輪詢Web服務?

編輯:我希望第一iPhone接收JSON更新,只要服務器處理它們,而不必請求。

我想因爲服務器是一個web服務,這被稱爲彗星,但我還沒有看到一個很好的iPhone例子。

+0

我會認真考慮是否需要這樣做。保持與服務器的開放連接以實時接收更新 - 從而使手機上的收音機始終處於活動狀態 - 將會像瘋狂一樣降低功耗。 – 2009-10-06 13:39:27

回答

13

這取決於你是如何的冒險。這裏有兩種選擇:

  1. Apple's Push Notifications即使你的應用程序沒有運行,它也能工作。
  2. 自己維護與服務器的TCP連接。這需要您進行更多的編程工作 - 當iPhone決定從3G轉向WiFi時,底層的NSStream玩弄並試圖處理案件。這也可以很快耗盡電池。如果你選擇這條路,socket streams programming guide可以成爲開始的好地方。

更新:看看iStreamLight - Lightstreamer protocol implementation for iPhone。如果它不適合您的Comet網絡服務,則可能需要下到較低級別,該級別使用套接字流來維持TCP連接。爲了簡化處理JSON數據結構的任務,您可能需要使用JSON framework for Objective-C

+0

當然這不是正確的迴應。 – DevDevDev 2009-09-29 21:12:48

+0

由此我的意思是,如果我有一個Web服務的iPhone需要獲取數據,我需要使用Comet?但是如何在不使用Javascript庫的情況下做到這一點? – DevDevDev 2009-09-29 21:19:39

+1

不,你不需要JavaScript。彗星只是一個想法。最簡單的實現是一個NSURLConnection,它具有異步運行的非常長的超時或在非UI線程中運行。連接應該保持打開狀態,直到服務器有數據,在這種情況下,它應該發送數據並關閉連接,然後你就可以得到它。然後立即打開一個到服務器的新連接並開始等待。 – s4y 2009-10-06 15:56:02

0

對於Web服務,又名彗星可能要結帳這個其他的StackOverflow問題here.

1

這可能在其他職位已經提到,但http://code.google.com/p/istreamlight/是檢查出來的好地方。它使用lightstreamer服務器(不知道這一點)。你可以看看這是否是你想爲你的應用程序實現一個彗星客戶端。

我真的希望我能更有幫助。如果你正在尋求一種方法來做到這一點在JavaScript中,我會完全!

祝你好運,

-Todd

+0

Yup tehre是在JS裏做這個的大量信息。感謝您的鏈接,我會研究它。 – DevDevDev 2009-09-30 23:03:09

3

你需要的是某種COMET框架(如光纜)。有幾種方法可以做到這一點 - 套接字連接或HTTP服務器,它們持有你的輪詢,直到有一些數據可用於交付或直到HTTP請求超時。其他選項包括使用像Flash或Silverlight/Moonlight這樣的插件(假設使用monodouch可以在iPhone上使用這樣的插件?)

一個好的新的(基於IIS的)COMET框架,可以移動大量數據非常高效的方式是來自Frozen Mountain的WebSync,它支持託管的基於COMET的PubSub框架(稱爲WebSync on Demand),可以根據您的負載進行擴展。它通過JavaScript很好地工作,並有一個非常乾淨的API。

+0

迄今爲止,WebSync(使用其服務器快速版本,而不是按需)軟件給我留下了非常深刻的印象。目前這些文檔只是一個小小的細節,但他們監控他們的谷歌社區,這樣我就不用等上幾個小時才能得到對問題的迴應。 – Matt 2010-02-12 21:42:55