0

方案:我有第三方應用程序服務器,gcm http連接服務器和用於推送通知的Android應用程序設置。當用戶卸載應用程序時,我可以通過發送他們的(不再有效)註冊ID推送通知並處理從gcm連接服務器返回的"NotRegistered"錯誤從我的第三方服務器中刪除它們。Android Gcm取消註冊用戶訂閱應用程序卸載時的主題

但是,當您向訂閱「主題」的用戶發送推送通知時,這種類似的方法似乎不起作用,因爲此處gcm連接服務器僅返回帶有"message_id"的json對象。是

我在第三方服務器數據庫表中的顯着列如下:

| gcmRegistrationID (string) | subscribedToNotificationTopic (boolean) | 

有誰知道如何識別先前在subscribedToNotificationTopic列設置true,然後卸載應用程序用戶?

我對如何解決這個問題有一個想法,但它似乎有點混亂。

  1. 每隔一段時間,而不是僅向主題發送推送通知,例如,

    { 
        "to" : "/topics/global", 
        ... 
    } 
    

    向訂閱該主題的用戶的註冊ID發送推送通知,例如,

    { 
        "registration_ids" : {list of registration ids}, 
        ... 
    } 
    

    這樣我就可以檢索和處理任何"NotRegistered"錯誤。

然而,這個問題是,多播消息有1000個用戶的限制,所以我必須發送一個消息爲每千個。

這似乎是不好的做法(尤其是如果涉及多個主題),但也許這是唯一的方法?

(額外標籤:主題訊息,發佈訂閱,取消註冊,谷歌雲通訊)

回答

0

首先,我不知道它是正確的假設,一個「NotRegistered」錯誤只能是用戶卸載的結果你的應用。如果設備收到消息但該消息無法傳遞,似乎該設備可能未註冊。如果用戶停止應用程序(這是無法卸載它不同就會發生這種情況,或者,即使應用程序被打死,保持停止由於省電模式。

https://developers.google.com/cloud-messaging/ccs#response

如果NotRegistered,你應該從 因爲應用程序從 設備卸載,或者客戶端應用程序未配置爲接收郵件刪除註冊的ID服務器數據庫。

你可以做的是從設備側,定期REGI請確保您獲取的令牌與您存儲的令牌相同,如果沒有使用新令牌更新服務器。

至於檢測用戶是否已經通過對主題消息的響應卸載了您的應用程序,我同意您的看法,這似乎不是直接可能的。作爲您提議的解決方案的替代方案,您可能會每隔一段時間在主題消息中加入一個標誌,要求設備使用您的服務器驗證自己,如果設備在經過若干次嘗試或某段時間後未驗證自身你可能會得出結論,用戶不再聆聽。

另一個問題是爲什麼你真的需要需要知道。發送一些額外的regid到谷歌是否有任何傷害?如果用戶退出Web服務,則可以將其從列表中刪除,但是如果他們只是從該設備上卸載應用程序,您是否確實需要採取措施? - 只需要考慮一些事情。希望這可以幫助。

+0

nPn,真的很感謝你的回答。我確實考慮過自定義投票,但我希望會有其他事情。至於爲什麼我需要知道,它真的歸結爲規格和效率。 –

相關問題