7

我正在開發一個消息應用程序,我對如何將數據從服務器發送到客戶端存在困難。服務器到客戶端的消息傳遞是否依賴於APNS?

我正在使用中央服務器設計,其中客戶端使用NSURLConnection向服務器發送消息,服務器不保留和管理打開的套接字並且無法爲其中一個客戶端發送消息。因此,客戶端使用計時器並每隔2秒查詢一次服務器,以查看是否有新數據正在等待它們。

這種方法的問題是,輪詢每2秒服務器似乎殺電池非常快,所以我想也許不是客戶輪詢服務器,以使用APNS *因此,當服務器有一些新信息 **對於客戶端,服務器會向客戶端發送推送通知* **,則客戶端將從服務器獲取數據。

*使用APNS - 如果客戶端允許,客戶端當然可以禁用此選項。所以我會檢查每次應用程序進入前臺時是否允許推送,如果不是,我會返回到投票方式。

** 新信息可以是從短信到服務器管理消息的任何內容。 (並且有很多管理消息...)
例如,在我的應用程序中,用戶可以看到他們的朋友狀態(在線/離線),因此如果user1和user2是朋友,並且user2只是將他的狀態從聯機更改爲離線,那麼服務器需要將這個新信息(admin message = user2_offline)發送給user1。

***推送通知服務器將是空的(沒有數據/聲音),它只是一個觸發客戶端來獲取新的信息,所以如果一推被髮送到客戶端而客戶端應用程序很近,他不會注意到任何事情。 (如果應用程序正在運行,那麼它會從服務器獲取新信息)

此方法是否適用於需要大量推送通知的大型消息應用程序?

爲了更清楚我的主要問題是:
1.是APNS足夠可靠的,我可以用它作爲我的核心服務器到客戶端的消息機制?
2.蘋果是否會從我的服務器每天批准數千或數十萬個推送通知?

+0

看一看SocketIO(長輪詢)你擁有投票機制。 – Till

回答

-1

我已經在這方面工作了一段時間,從我的經驗不足,我認爲你解決問題的方法將無處可達。請允許我首先強調一些關於APN特徵的重要事實:

  1. APNs不可靠,它們不能100%保證到達客戶端。
  2. 截至蘋果的文檔,APNs是盡最大努力,很多時候他們可能達不到。
  3. APNs不會在內部保存數據,因此即使它們到達您的客戶端應用程序,它們也不會在應用程序中持有任何內容。
  4. APNs只是通知用戶發生了與應用程序相關的事情,而有消息(出現在APN的Alert Box中的文本)由iOS處理,而不是由您的應用程序處理。這就是爲什麼具有iOS 4的設備將以與iOS 5設備不同的方式顯示APN,這是OS作業而不是您的應用程序。
  5. 當通知到來時,應用程序圖標上顯示的徽章值是服務器的責任,而不是設備操作系統。換句話說,當APN到達設備時,它應該爲您的應用程序提供新的通知計數值。操作系統不會爲此做任何事情。

話雖如此,我想解釋一下通常這樣的應用程序是如何設計的。首先,這不是通過URL連接完成的,客戶端在每個時間段都不檢查服務器。通常你有一個客戶機/服務器體系結構,你的客戶機是設備上的應用程序,而服務器是駐留在服務器機器上的真實服務器程序。服務器可以是Microsoft(例如使用C#)或MAC(使用Objective C)。服務器有一個存儲信息的數據庫。一些重要信息(與您的問題有關)是APN計數值,您想要傳送的消息,客戶端的狀態(如果在線或離線的)。

當客戶端喜歡將某些東西發送給另一個客戶端,或者當服務器想要向客戶端(或所有客戶端)發送某些內容時,會向接收方客戶端進行檢查以確定他是在線還是離線。如果他在線,則直接發送消息,通常在TCP套接字上完成通信。如果用戶處於脫機狀態,則服務器將存儲需要發送給客戶端的消息,增加APN計數值,並將APN發送給該收件人。當收件人變爲在線時,服務器會注意到(因爲存在建立的連接和握手),因此將從數據庫中提取所有未傳遞的消息並將它們發送給他...

這是一個漫長的過程,我希望我能夠向你解釋一些事情。在所有情況下,我認爲你的方式不切實際,或者使你能夠實現真正的工作。

+0

如果有興趣從客戶端/服務器開始使用套接字,您可能有興趣從[這裏]開始閱讀(http://stackoverflow.com/questions/10823544/iphone-communication-using-sockets/10824560#10824560) – antf

+2

「APN不會在內部保存數據,因此即使他們到達您的客戶端應用程序,他們也不會在應用程序內部留下任何數據。」這是不正確的 - 你可以把你自己的有效載荷放在裏面(雖然APN的總大小有限制) – Gruntcakes

+0

首先感謝你的回答,但我認爲有一些誤解......關於APNS的事實:(1,2 )我知道APNS是最好的努力,服務器可以檢查客戶是否得到推動,如果不是,他會重新發送。 (3)這是不正確的,我可以用它發送負載,但這不是我的目的,因爲我寫道:「推送通知服務器發送是空的(沒有數據/聲音),它只是客戶端獲取的觸發器新的信息「(4,5)我知道但與我的需求無關.. – Eyal

0

APNS是否足夠可靠,我可以使用它作爲我的核心服務器到客戶端消息機制?

NO。爲了完整起見,讓我重複一下原因。

  1. 蘋果本身不承擔可靠性閱讀Programming Guide
  2. 此外,APNS,具有QoS的組件,它可以被實時成本提高可靠性(對於例如,我可以問APNS內隨時傳遞通知4周,如果設備無法訪問,請重試),這對您的情況無效。
  3. 根據您的要求,如果您發送無聲推送(推送時沒有用戶可見消息),它將無法作爲高優先級推送發送,從而進一步降低可靠性。下面是相關報價

    「沉默的通知並不意味着作爲一個方式,讓您的應用程序醒着 背景,也不是意味着高優先級更新。APN的 對待無聲的通知爲低優先級,並可能扼殺他們的 如果總數量變得過多,實際 限制是動態的,可以根據條件變化,但儘量不要發送 每小時發送多個通知。「

將蘋果批准潛在的幾千或幾十萬推送通知,每天從我的服務器?

一般來說,APNS不會有負載方面任何與此問題,但它有節流的地方,他們可能會扼殺你的通知,見上面第3點

恕我直言,你應該看看XMPP,因爲這個協議的設計只是像你這樣的用例,他們有無線de社區在所有平臺上的支持。我建議你看看類似https://github.com/robbiehanson/XMPPFramework的東西,並在後端安裝一個XMPP服務器,它將處理消息和狀態消息以及管理消息。

如果你已經評估過XMPP並且不想去用它,我建議你需要將一個智能系統放在iOS應用程序中,該應用程序採用基於應用程序狀態的不同策略,如下所示:策略

  1. A可實時插座爲基礎的方法 - >建立您永久套接字連接,並保持同步,儘可能的數據(這是當你的應用程序運行到前臺或後臺)
  2. 輪詢系統你說話了有關問題,可以在您的應用程序被調用以用於後臺提取/位置更新等時使用。
  3. 使用APNS與用戶可見的消息+自定義數據,當您的服務器建立之前檢測到設備沒有活動的套接字,也沒有調查的很長一段時間
相關問題