我有一個使用GCM的大型用戶羣的Android應用程序。服務器端配置錯誤導致我們的GCM註冊數據庫零備份(非常糟糕!),現在無法向這些應用程序發送消息。什麼事件導致GCM重新註冊?
我的問題是:什麼客戶端或服務器系統事件會導致GCM重新註冊服務器?例如客戶端apk版本更新,客戶端谷歌播放服務更新等。
作爲替代方案,有沒有辦法使服務器基本上使所有的令牌註冊無效,這樣所有的Android客戶端將被迫重新註冊?
我有一個使用GCM的大型用戶羣的Android應用程序。服務器端配置錯誤導致我們的GCM註冊數據庫零備份(非常糟糕!),現在無法向這些應用程序發送消息。什麼事件導致GCM重新註冊?
我的問題是:什麼客戶端或服務器系統事件會導致GCM重新註冊服務器?例如客戶端apk版本更新,客戶端谷歌播放服務更新等。
作爲替代方案,有沒有辦法使服務器基本上使所有的令牌註冊無效,這樣所有的Android客戶端將被迫重新註冊?
您必須發佈一個新版本的應用程序(如果您當前的邏輯尚未完成)應該註冊到GCM並將註冊ID發送到您的服務器。不幸的是,這隻會爲您提供僅用於安裝新版本的設備的註冊ID,但您可以做的更好。
您可以爲您的新應用程序版本添加邏輯,以便在下次發生時能夠克服此問題,而不需要新版本。例如,每次啓動應用程序時,都會向包含應用程序實例的唯一ID(不一定是註冊ID)的服務器發出API調用,並且如果您的服務器在您的數據庫中找不到該ID(或不找不到與其關聯的註冊ID),則會強制應用程序實例經歷一些註冊過程,這需要應用程序將註冊ID重新發送到您的服務器。這仍然不會幫助您恢復未啓動您的應用的設備的註冊ID,但至少您可以恢復所有活動用戶的註冊ID。
我不知道這個方法有多少是可行的,但它仍然可能是有用的。
您需要發佈一個新版本的應用程序。
每當向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。