3

我正在使用GCM進行應用程序通知,如圖所示here。該代碼是樣板:如何讓GCM與應用和服務器保持同步?

GCMRegistrar.checkDevice(this); 
GCMRegistrar.checkManifest(this); 

final String regId = GCMRegistrar.getRegistrationId(this); 
if (regId.equals("")) { 
    GCMRegistrar.register(this, SENDER_ID); 
} else { 
    Log.v(TAG, "Already registered"); 
} 

然後onRegistered()回調更新我的服務器返回的註冊ID。

但是,有幾次GCM進入了不一致的狀態。在一種情況下,即使GCMRegistrar.getRegistrationId()給我一個非空的註冊ID字符串,它也不會轉發任何通知。在其他情況下,我最終得到兩個或更多重複的消息。

在試圖避免這些情況,我現在有一個蠻力解決方案,它的工作原理是這樣的:

if (GCMRegistrar.isRegistered(this)) 
    GCMRegistrar.unregister(this); 
else 
    GCMRegistrar.register(this, GCMConstants.SENDER_ID); 

在onUnregistered()回調,我告訴我的服務器上刪除的註冊ID,然後調用GCMRegistrar.register()。在onRegistered()回調中,我告訴我的服務器添加註冊標識。

到目前爲止,它工作正常,但效率明顯低於應用程序的效率,而且我不確定它是否不受不一致問題的影響。如果我可以指望getRegistrationId()總是返回一個有效的id,即當前/規範的註冊id,會更好。

確保我的應用程序,我的服務器和GCM之間一致性的最簡單/最乾淨的方法是什麼?謝謝。

回答

2

如果您解析您從Google獲得的回覆,並確定您在回覆中收到規範註冊ID的情況,那麼可以解決獲取重複郵件的問題。在這種情況下,您可以刪除舊的註冊ID,並保留規範的註冊ID。

我認爲比你的蠻力解決方案更好的解決方案是在應用程序啓動時總是調用register。您可能會在onRegistered()中收到上次調用時獲得的相同註冊ID,但如果您在設備中保留該註冊ID,則可以將持久ID與接收ID進行比較,並避免將註冊ID重新發送到服務器沒有改變。

+0

感謝您的回覆 - 快速跟進。 getRegistrationId()函數的用途/有效性是什麼?我不清楚它從哪裏獲得註冊ID;它似乎是一個同步調用,所以我想它不是直接來自GCM。我的一個問題是它偶爾會返回一個陳舊的標記(?)。我說得對,你的解決方案沒有必要嗎? – gcl1 2013-03-21 16:52:03

+0

還有一個問題。是否可以多次調用GCM的'register()'?如果它返回一個不同的reg ID,那麼舊的會發生什麼? – gcl1 2013-03-21 17:03:23

+0

我從不使用'getRegistrationId()',所以我不能說。在「註冊」和「取消註冊」後嘗試調用該方法會很有趣。我想知道它是否仍然會返回舊的ID。也許它只在第一次註冊之前返回null。我認爲多次調用'register'應該是安全的。如果它返回一個不同的註冊ID,那麼舊註冊ID仍然可以工作,但是當你使用舊註冊ID發送一個通知時,你會得到新的註冊ID作爲規範註冊ID的響應。但是,一旦你得到一個新的,你應該從你的數據庫中刪除舊的。 – Eran 2013-03-21 17:11:52

相關問題