2015-07-21 66 views
1

我正在嘗試爲iOS設備設置可靠的推送通知,並且正在尋找關於使用Google雲消息傳遞的建議方法的指導。我的應用程序是一個消息應用程序,但可能適用於其他類型的應用程序。如何使用GCM實現向iOS的可靠交付?

目前,我通過HTTP連接服務器使用GCM,並且發現如果iOS設備丟失服務或關閉,並非所有消息都會傳遞。我相信這是預期的表現,這是因爲GCM使用Apple的APNS,並不保證傳遞,並且可悲的是每個應用只能在隊列中保留最多一個通知。

我希望(希望?),GCM將保持自己的隊列來解決這個問題。也許它確實存在,我只是做得不對?

其他的可能性我遇到:

  • Non-collapsible messages。不幸的是,這些文檔讓我很困惑,我是否可以用它來實現我所需要的。
  • The delivery_receipt_requested flag。這至少可以(雖然增加了我的複雜性)用來確定消息是否到達。我看到它需要XMPP。但是,如果我在具有多個registration_ids的單個HTTP請求上設置標誌,那麼可能會返回多個XMPP響應?我願意切換到使用XMPP。如果這是推薦的路徑,那麼對於如何實現這一點有什麼建議?此外,這些交付收據是否可靠?

任何幫助將不勝感激!提前致謝!!

回答

1

不幸的是,除非您在設備中實施循環,否則您無法知道您的推送通知是否已發送到iOS設備。但是這也不會對你有任何幫助,因爲設備可能連接不良,並且仍然收到通知,但是你的循環返回請求可能不會通過,用戶也可以關閉後臺獲取,這將導致迴路無法繼續。

因此,您將無法完全解決您的問題 - 但對於大多數用戶來說,使用迴環是最好的解決方案。

在你必須設置content-available:1https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html

而且也在你的AppDelegate實現下面的方法,讓API請求您的服務器已成功接收到消息的通知:

- application:didReceiveRemoteNotification:fetchCompletionHandler: 

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:didReceiveRemoteNotification:fetchCompletionHandler

+0

使用Google雲連接服務器(XMPP)delivery_receipt_requested標誌可以實現同樣的(半成品)解決方案嗎?它看起來像Google建議在'application:didReceiveRemoteNotification:fetchCompletionHandler:'爲了實現這個目的而將'[[GCMService sharedInstance] appDidReceiveMessage:userInfo]'行? –

+0

它看起來像,但我只是短暫的一瞥。由於我上面提到的原因,請確保您知道這不是100%可靠的 –

0

您可以使用GCM發送所謂的數據消息。這裏閱讀https://developers.google.com/cloud-messaging/server#notifications_and_data_messages

優點是,他們不會默認崩潰,就像你想要的。缺點是GCM只能通過它自己的連接來傳遞它們,而不是通過APNS,這意味着你的應用只在運行時纔會接收它們(即不在後臺)。如果它不夠好,請考慮發送通知消息(總是通過APNS)和數據消息的組合。

但是,如果我在具有多個registration_ids的單個HTTP請求上設置標誌,也許我會回來多個XMPP響應?

而且,這些都是送達回執可靠嗎?

他們是最好的努力。這意味着在某些情況下(如設備連接不良),您可能無法立即收到收據或收到重複郵件。此外,送達回執僅支持數據消息,而不支持通知。