2011-07-06 25 views
9

我想知道是否有人遇到過這個問題Google C2DM?這是我面臨的情況:Android的C2DM:重複的消息到同一設備和應用程序

  1. 用戶安裝應用程序,並與C2DM服務器註冊 爲註冊 關鍵。
  2. 用戶卸載應用程序。
  3. 用戶重新安裝應用程序(和 註冊C2DM服務器的新 註冊碼)。

現在我從我的服務器發送消息到用戶的電話,他們得到一個重複的消息。

任何人都可以告訴我們這是預期的行爲還是我可以如何解決? 謝謝,

+1

你的意思是他們連續兩次得到相同的信息?這絕對不是預期的行爲 - 他們的雲密鑰在卸載時應該標記爲不再使用。在提問時出現愚蠢的問題和道歉 - 但你確定你的服務器代碼正在複製他們的雲ID嗎?你是否記錄了所有的c2dm服務器請求和谷歌發回的響應? –

回答

7

不知道這是最好的方法,但在android-c2dm組,其中海報提供了一個技術在有相關thread

我送註冊ID的消息中,所以我可以根據設備上存儲的註冊ID進行檢查。

如果它是不一樣的,放棄它,並通知註冊ID使用

不足之處是將註冊不再標識佔用了已經 限制郵件大小一些空間的服務。但我的情況完美,因爲我的 原始消息不超過幾個字符長。

+0

偉大的技術!看起來非常智能 – Matroska

0

是的,我遇到了同樣的問題,在我看來,這是Android C2DM實施中的一個大疏忽。 iOS處理這一點要好得多,因爲應用程序只能接收一個且僅有一個設備令牌的通知(相當於c2dm註冊ID)

我使用的解決方法是將註冊ID的最後10個字符作爲在C2DM有效載荷,然後在我的onMessage方法我這樣做以下檢查:

if (!regId.endsWith(bundle.getString("regsuffix"))) return null; 
1

另一種解決辦法是提供您的服務器與設備的唯一識別碼。在這種情況下,當設備在重新安裝後嘗試註冊時,您可以更新該UUID的註冊ID。

+0

+1我在我的應用程序的體系結構中執行相同的實現。但是,如果C2DM服務返回註冊無效,您可以再次刪除它。 –

4

這應該只發生在重新安裝應用程序後的第一次推送通知。

Google C2DM服務在檢測卸載的應用程序時處於被動模式。

卸載您的應用程序(無需從C2DM註銷!!!)的第一次推送通知將不會返回任何錯誤的迴應。但是,第二次推送通知將返回一個「無效註冊」或「未註冊」的錯誤代碼,您可以在其中意識到應用程序已被卸載。

原因是C2DM服務器立即返回響應代碼,然後才嘗試推送客戶端。當客戶端迴應卸載應用程序時,它將從C2DM服務器中刪除。下一次嘗試嘗試將立即返回錯誤代碼。

+0

但是,如果用戶在卸載並註冊Reg_Id後立即安裝應用程序會發生什麼情況。如果設備使用卸載前有效的reg_id進行推送。將郵件發送到設備還是會返回「無效註冊」。 – Erik

+0

註冊ID對於每個設備,應用程序和登錄的Google用戶都是唯一的。我想,在你描述的場景中,應用程序將獲得與以前的安裝相同的註冊ID,所以你應該沒問題。 – Zamel

0

@Zamel和@johan的答案都很好,需要合併。如果將兩種解決方案結合起來,那麼最大限度地減少服務器的數據庫。

所以最好的解決辦法是:發送推送令牌時,服務器

  • 更新推送令牌現有的設備ID發送時

    1. 發送設備ID

    2. 的Invalidate推送令牌在服務器的數據庫中,如果推送通知向服務器返回「無效註冊」或「未註冊」錯誤代碼

    當推送令牌被識別爲「無效註冊」或「未註冊」時,您可以使其無效(將其標記爲空),刪除數據庫中的行或實現到期功能。這取決於你的需求