Android 什么事件导致GCM重新注册?
我有一个Android应用程序,拥有大量使用GCM的用户群。服务器端错误配置导致我们的GCM注册数据库没有备份(非常糟糕!),现在无法向这些应用发送消息 我的问题是:什么客户端或服务器系统事件会导致GCM向服务器重新注册?e、 g.客户端apk版本更新、客户端google play服务更新等Android 什么事件导致GCM重新注册?,android,google-cloud-messaging,Android,Google Cloud Messaging,我有一个Android应用程序,拥有大量使用GCM的用户群。服务器端错误配置导致我们的GCM注册数据库没有备份(非常糟糕!),现在无法向这些应用发送消息 我的问题是:什么客户端或服务器系统事件会导致GCM向服务器重新注册?e、 g.客户端apk版本更新、客户端google play服务更新等 作为替代方案,是否有一种方法让服务器基本上使所有令牌注册无效,这样所有Android客户端都将被迫重新注册?您必须发布一个新版本的应用程序(如果您当前的逻辑还没有这样做的话)应向GCM注册并将注册ID发送到
作为替代方案,是否有一种方法让服务器基本上使所有令牌注册无效,这样所有Android客户端都将被迫重新注册?您必须发布一个新版本的应用程序(如果您当前的逻辑还没有这样做的话)应向GCM注册并将注册ID发送到您的服务器。不幸的是,这将只为安装新版本的设备提供注册ID,但您没有更好的办法
您可以向新的应用程序版本添加逻辑,以便在下次出现此问题时能够克服此问题,这次不需要新版本。例如,每次启动应用程序时,对包含应用程序实例的某个唯一ID(不一定是注册ID)的服务器进行API调用,如果服务器在数据库中找不到该ID(或找不到与其关联的注册ID),则强制应用程序实例执行某个注册过程,这需要应用程序将注册ID重新发送到您的服务器。这仍然不能帮助您恢复未启动应用程序的设备的注册ID,但至少您可以恢复所有活动用户的注册ID。我不知道这种方法有多可行,但它仍然可能有用
- 您需要发布应用程序的新版本
- 每当向GCM注册的应用程序启动时,它都会查找注册id并调用
函数。我们将其存储在应用程序数据中的共享pref中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存储在共享的prefs中(这里是PROPERTY\u REG\u id,它已经定义为
)。每次我们的应用程序启动时,它都会检查是否存在此密钥公共静态最终字符串PROPERTY\u REG\u id=“registration\u id”
- 所以我的建议是更改注册id的共享prefs密钥
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);
}
注册后,您需要使用新的共享prefs密钥来存储新的注册id
这整件事的缺点是,你只能获得那些想要更新应用程序的人的注册id。