2014-10-20 30 views
1

我有一個使用GCM的大型用戶羣的Android應用程序。服務器端配置錯誤導致我們的GCM註冊數據庫零備份(非常糟糕!),現在無法向這些應用程序發送消息。什麼事件導致GCM重新註冊?

我的問題是:什麼客戶端或服務器系統事件會導致GCM重新註冊服務器?例如客戶端apk版本更新,客戶端谷歌播放服務更新等。

作爲替代方案,有沒有辦法使服務器基本上使所有的令牌註冊無效,這樣所有的Android客戶端將被迫重新註冊?

回答

1

您必須發佈一個新版本的應用程序(如果您當前的邏輯尚未完成)應該註冊到GCM並將註冊ID發送到您的服務器。不幸的是,這隻會爲您提供僅用於安裝新版本的設備的註冊ID,但您可以做的更好。

您可以爲您的新應用程序版本添加邏輯,以便在下次發生時能夠克服此問題,而不需要新版本。例如,每次啓動應用程序時,都會向包含應用程序實例的唯一ID(不一定是註冊ID)的服務器發出API調用,並且如果您的服務器在您的數據庫中找不到該ID(或不找不到與其關聯的註冊ID),則會強制應用程序實例經歷一些註冊過程,這需要應用程序將註冊ID重新發送到您的服務器。這仍然不會幫助您恢復未啓動您的應用的設備的註冊ID,但至少您可以恢復所有活動用戶的註冊ID。

0

我不知道這個方法有多少是可行的,但它仍然可能是有用的。

  • 您需要發佈一個新版本的應用程序。

  • 每當向GCM註冊的應用程序啓動時,它都會查找註冊ID並調用getRegistrationId()函數。我們將其存儲在我們的應用數據中的共享首選項中。

下面是來自官方的文檔一些代碼:

private String getRegistrationId(Context context) 
{ 
    final SharedPreferences prefs = getGCMPreferences(context); 
    String registrationId = prefs.getString(PROPERTY_REG_ID, ""); 

    if (registrationId.isEmpty()) 
    { 
     Log.i(TAG, "Registration not found."); 
     return ""; 
    } 

    int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); 
    int currentVersion = getAppVersion(context); 

    if (registeredVersion != currentVersion) 
    { 
     Log.i(TAG, "App version changed."); 

     return ""; 
    } 

    return registrationId; 
} 
  • 我們使用特定的鍵設好註冊ID存儲在共享的首選項(這是PROPERTY_REG_ID這已經是定義爲public static final String PROPERTY_REG_ID = "registration_id";)。每次我們的應用程序啓動時,它都會檢查此密鑰的存在。

  • 所以我建議的是改變這個共享的首選項的註冊ID的關鍵。

這肯定不會在共享的首選項中找到,並會要求從GCM重新註冊,並會調用registerInBackground()功能。

private void registerInBackground() 
{ 
    new AsyncTask() 
    { 
     @Override 
     protected String doInBackground(Void... params) 
     { 
      String msg = ""; 

      try 
      { 
       if (gcm == null) 
       { 
        gcm = GoogleCloudMessaging.getInstance(context); 
       } 

       regid = gcm.register(SENDER_ID); 
       msg = "Device registered, registration ID=" + regid; 

       sendRegistrationIdToBackend(); 

       storeRegistrationId(context, regid); 
      } 
      catch (IOException ex) 
      { 
       msg = "Error :" + ex.getMessage(); 
      } 

      return msg; 
     } 

     @Override 
     protected void onPostExecute(String msg) 
     { 
      mDisplay.append(msg + "\n"); 
     } 
    }.execute(null, null, null); 
} 

註冊後,您需要使用新的共享首選項密鑰來存儲新的註冊ID。

這整個事情的缺點是,你可以得到只有那些誰更新應用程序的註冊ID。