2012-08-27 134 views
0

我正在將我的Android應用程序從C2DM遷移到GCM。我有服務器端設置來接收兩者都是指示GCM與C2DM的ID,然後在服務器端,我通過相應的服務發送出去,具體取決於它所註冊的服務。遷移到GCM,但仍然有C2DM註冊ID

我遇到的問題是,應用程序正在以我的服務器註冊爲GCM(應用程序更新使用新的發件人ID在意圖。)但不幸的是,它傳遞給服務器的ID註冊ID實際上是舊的C2DM ID。

作爲此遷移的一部分(在應用程序代碼中),我需要做些什麼來確保獲得新的(GCM)ID,而不是繼續使用現有的C2DM註冊ID。這對我來說很容易測試和重現,並且每次都會得到一致的結果(來自GCM服務器的MisMatchedSenderId)。我需要先註銷C2DM ID嗎?

+0

注意顯示您在應用程序中用於註冊GCM的代碼? – Femaref

+0

public static void register(Context context, String senderId){ Intent registrationIntent = new Intent(REQUEST_REGISTRATION_INTENT); registrationIntent.putExtra(EXTRA_APPLICATION_PENDING_INTENT, PendingIntent.getBroadcast(context,0,new Intent(),0)); registrationIntent.putExtra(EXTRA_SENDER,senderId); context.startService(registrationIntent); } –

回答

0

我們能夠找出問題所在,因爲該設備已經有一個註冊ID(c2dm),它甚至沒有試圖用新的senderId(gcm)命中註冊服務器,因此它使用舊的c2dm註冊ID。感謝您的意見

+0

很高興您能夠理順它。你應該接受你自己的答案,因爲這是你的問題的正確答案。如果可以的話,詳細闡述爲什麼它會保留舊的註冊ID(例如,它是由谷歌代碼導致的,還是代碼存儲在首選項或其他內容中),以及你做了什麼來解決它(清除首選項?稱爲不同的c2dm方法?)。 – ajh158

+0

當然沒有問題, 基本上,舊的註冊ID(用於c2dm)存儲在首選項中,只要註冊ID存在,即將註冊GCM的方法甚至不會被調用。爲了解決這個問題,我只是從首選項中清除註冊ID,從而觸發了與GCM的新註冊。應該注意的是,在清除舊的註冊ID之前,我用DELETE調用了我的服務器,以便從C2DM設備列表中刪除它,因此我應該看到,隨着GCM數據庫獲取設備,數據庫一直收縮。 –

0

您必須更新客戶端代碼才能發送Google API項目ID而不是電子郵件地址作爲發件人ID。

有關如何獲取Google API項目ID的說明,請參閱GCM Getting Started Guide

下面是示例代碼的變化,我從Migration Guide複製:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); 
// sets the app name in the intent 
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); 
registrationIntent.putExtra("sender", senderID); 
startService(registrationIntent);

在我的情況,senderID實際上從strings.xml中讀取,所以我不得不與谷歌的API有更換電子郵件地址項目ID。

+0

是的,我已經做到了。問題似乎是設備保留了舊的C2DM註冊ID並將其發送到我的服務器,而不是獲取新的GCM註冊ID。然而,新安裝(從來沒有c2dm註冊ID)成功工作。 –

+0

在你的代碼中的某個地方,你應該打電話給 – ajh158

+0

。對不起,我以前的評論,等了太久才能編輯它。我想說的是,我會嘗試在調用startService(以驗證新的sendID被傳入)和Receiver中的onRegister和onError之前設置斷點,以查看您得到的響應。在附註中,我爲C2DM和GCM返回的註冊ID顯示爲相同的格式。 – ajh158