2013-06-04 124 views
9

如果我發送通知到設備,而設備是離線我得到的是這樣的:發送GCM通知到離線設備

Error: Unavailable

而且我必須重新發送。

我的問題是:

請問GCM服務器保持這些通知在隊列中,並自動對時設備在線重新發送?或者它必須完全由我處理。

因爲如果GCM服務器將自動發送它們(一旦設備聯機),直到它實際發送通知,我的服務器就會假定它們已經發送。如何跟蹤通知重新發送成功的時間?

我可能會在我的服務器端標記,通過查看Unavailable error message不發送通知,但無法確定如何將它們標記爲GCM成功發送通知後發送的通知。

謝謝

回答

11

A/C到文檔---當第三方服務器發佈消息到GCM和接收消息ID後面,但這並不意味着該消息已傳送到設備。相反,這意味着它被接受交付。消息被接受後會發生什麼取決於許多因素。

如果設備連接但空閒,消息仍將立即傳遞,除非delay_while_idle標誌設置爲true。否則,它將被存儲在GCM服務器中,直到設備喚醒。這就是collapse_key標誌發揮作用的地方:如果已經存在一條具有相同摺疊鍵(和註冊ID)的消息並且等待傳送,則舊的消息將被丟棄,並且新消息將取代它(即,舊消息將被新消息摺疊)。但是,如果未設置摺疊鍵,則新郵件和舊郵件都將被存儲以備將來投遞。

注意:可以存儲多少條消息而不折疊的限制。該限制目前爲100.如果達到限制,則丟棄所有存儲的消息。

+0

怎麼會我的服務器知道通知何時最終發送(成功)? – user1537779

+0

我不認爲有可能從GCM服務器獲取該信息。這意味着您將不得不依賴成功接收您的消息的客戶端應用程序和服務器之間的另一種通信方法。 您從GCM服務器獲得的響應(如您所知)只是讓您知道: 成功:已處理的消息數量無錯誤。 或 失敗:無法處理的消息數。 –

+0

'我可能會在我的服務器端標記通知不是通過查看不可用的錯誤消息發送的,但是無法確定如何將它們標記爲GCM成功發送通知後發送的消息'我可能最終再次發送相同的通知if我不知道gcm服務器是否稍後發送它們。 – user1537779

2

我所做的是將推送指示有效負載分開。在我的GCM消息中,我只包含有效負載的URI,並將有效負載存儲在可通過消息中的URI訪問的數據庫表中。

當客戶端收到一條消息時,這個樣子,與HATEOAS風格鏈接:

{ 
    _links: { 
    message: { 
     rel: 'message', 
     href: 'https://my-server.com/push/<messageId>' 
    } 
    } 
} 

客戶端然後進入GET從URI,此時服務器知道它已經交付並可以相應地更新消息的有效載荷。獲取有效負載也會將其刪除。

如果GCM重新遞送不夠健壯,這也意味着客戶可以選擇手動獲取所有待處理的消息,例如,當離線後恢復網絡連接時,通過讓端點返回給定ANDROID_ID或類似的所有消息。如果稍後發送的GCM消息,則客戶端將在該消息中獲得404的URI,並將其視爲無操作,即已經處理的消息。

如果這是矯枉過正,重量輕的做法只是實現消息傳遞的服務器的認識是有一個簡單的方應答與給定ID的消息的接收端點,如

POST https://my-server.com/push/notifyReceived 

{ 
    messageId: <messageId> 
} 
+0

這是一個有趣的方法,但它並不直接回答這個問題。 GCM試圖重新投遞嗎? – Flimm

+1

你說得對。這可能更適合作爲評論,但有點太長,我希望它可以幫助某人。 – JHH

相關問題