Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 什么事件导致GCM重新注册?_Android_Google Cloud Messaging - Fatal编程技术网

Android 什么事件导致GCM重新注册?

Android 什么事件导致GCM重新注册?,android,google-cloud-messaging,Android,Google Cloud Messaging,我有一个Android应用程序,拥有大量使用GCM的用户群。服务器端错误配置导致我们的GCM注册数据库没有备份(非常糟糕!),现在无法向这些应用发送消息 我的问题是:什么客户端或服务器系统事件会导致GCM向服务器重新注册?e、 g.客户端apk版本更新、客户端google play服务更新等 作为替代方案,是否有一种方法让服务器基本上使所有令牌注册无效,这样所有Android客户端都将被迫重新注册?您必须发布一个新版本的应用程序(如果您当前的逻辑还没有这样做的话)应向GCM注册并将注册ID发送到

我有一个Android应用程序,拥有大量使用GCM的用户群。服务器端错误配置导致我们的GCM注册数据库没有备份(非常糟糕!),现在无法向这些应用发送消息

我的问题是:什么客户端或服务器系统事件会导致GCM向服务器重新注册?e、 g.客户端apk版本更新、客户端google play服务更新等


作为替代方案,是否有一种方法让服务器基本上使所有令牌注册无效,这样所有Android客户端都将被迫重新注册?

您必须发布一个新版本的应用程序(如果您当前的逻辑还没有这样做的话)应向GCM注册并将注册ID发送到您的服务器。不幸的是,这将只为安装新版本的设备提供注册ID,但您没有更好的办法


您可以向新的应用程序版本添加逻辑,以便在下次出现此问题时能够克服此问题,这次不需要新版本。例如,每次启动应用程序时,对包含应用程序实例的某个唯一ID(不一定是注册ID)的服务器进行API调用,如果服务器在数据库中找不到该ID(或找不到与其关联的注册ID),则强制应用程序实例执行某个注册过程,这需要应用程序将注册ID重新发送到您的服务器。这仍然不能帮助您恢复未启动应用程序的设备的注册ID,但至少您可以恢复所有活动用户的注册ID。

我不知道这种方法有多可行,但它仍然可能有用

  • 您需要发布应用程序的新版本

  • 每当向GCM注册的应用程序启动时,它都会查找注册id并调用
    getRegistrationId()
    函数。我们将其存储在应用程序数据中的共享pref中

以下是官方文件中的一些代码

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密钥

这肯定不会在共享pref中找到,它将要求从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);
}
注册后,您需要使用新的共享prefs密钥来存储新的注册id

这整件事的缺点是,你只能获得那些想要更新应用程序的人的注册id。