iphone - notification - 推播英文




服務器到客戶端的消息傳遞是否依賴於APNS? (2)

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

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

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

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

這是一個漫長的過程,我希望我能夠向你解釋一些事情。 在任何情況下,我都不認為你的方法是實際的,或者使你能夠實現真正的工作。

我正在開發一個消息應用程序,我有一個關於如何將數據從服務器發送到客戶端的困境。

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

這種方法的問題是,每2秒鐘輪詢一次服務器似乎會非常快地關閉電池,所以我想可能不是客戶端輪詢服務器,而是使用APNS *,以便服務器為客戶端提供一些新信息時 ,服務器會向客戶端發送推送通知 * **,然後客戶端將從服務器獲取數據。

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

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

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

這種方法是否可以處理需要大量推送通知的大量消息應用程序?

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


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

NO 。 只是為了完整,讓我重複一下原因。

  1. 蘋果公司自己放棄了編程指南的可靠性
  2. 此外,APNS有一個QoS組件,可以以實時為代價提高可靠性(例如,我可以要求APNS在4週內隨時發送通知,如果設備無法訪問,請重試),這對您的情況沒有用處。
  3. 按照您的要求,如果您發送無聲推送(推送沒有用戶可見消息),則無法將其作為高優先級推送進行發送,從而進一步降低可靠性。 這是一個相關的報價

    “無聲通知並不意味著保持您的應用程序在後台保持清醒狀態,也不是為了獲得高優先級的更新.APN將無提示通知視為低優先級,如果總數過多,可能會將其交付完全限制,實際限制是動態的,可以根據條件進行更改,但是盡量不要每小時發送幾個通知。“

蘋果是否會從我的服務器每天批准數千或數十萬個推送通知?

一般來說,APNS在負載方面不會有任何問題,但是它已經被限制了,他們可能會限制你的通知,見上面的第3點

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

如果您已經評估過XMPP並且不想去使用它,我建議您需要在iOS應用中使用基於App State的不同策略的智能係統,如下所示,您可以採取以下策略

  1. 一個基於實時套接字的方法 - >建立一個永久套接字連接並儘可能保持數據同步(這是當你的應用程序運行到前台或後台時)
  2. 您討論的輪詢系統,當您的應用程序被調用用於後台獲取/位置更新等時可以使用該輪詢系統。
  3. 當你的服務器檢測到設備沒有活動的套接字,也沒有很長一段時間的輪詢時,使用帶有用戶可見消息+自定義數據的APNS




apple-push-notifications