Android使用Canonical ID GCM

时间:2016-04-25 10:40:38

标签: android google-cloud-messaging

我在这里提到 Android GCM messages repeated 问题是我多次安装并重新安装应用程序,因此它有很多regId。我发现许多帖子建议使用Canonical ID。我读过很多帖子,但我真的不知道如何应用它。以下是获取regId的代码:

   public String getRegId(){
            int noOfAttemptsAllowed = 3;   // Number of Retries allowed
              int noOfAttempts = 0;          // Number of tries done
              boolean stopFetching = false;     // Flag to denote if it has to be retried or not
              String regId = "";             


              while (!stopFetching) 
              {
                   noOfAttempts ++;
                   try {
                       regId = gcm.register(PROJECT_NUMBER);
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                   try 
                   {

                      Thread.sleep(4000);   // Set this timing based on trial.

                      try {
                           regId = gcm.register(PROJECT_NUMBER);
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
               } catch (InterruptedException e) {
                e.printStackTrace();
               }
                  /* try
                   {
                        // Get the registration ID
                        regId = gcm.register(PROJECT_NUMBER);
                   } catch (Exception e) {}*/


                   if (!regId.equals("") || noOfAttempts > noOfAttemptsAllowed)
                   {
                        // If registration ID obtained or No Of tries exceeded, stop fetching
                        stopFetching = true;
                    }
                    if (!regId.equals(""))
                    {
                        // If registration ID Obtained, save to shared preferences
                           SharedPrefrencesMethods.savePreferences(activity, "regid", regid);
                    }


               }
              return regId;
        }

1 个答案:

答案 0 :(得分:2)

是。您可以使用规范ID来帮助您更轻松地从错误中恢复。它是客户端应用程序请求的最后一次注册的注册令牌。这是服务器在向设备发送消息时应使用的ID。

  

如果您尝试使用旧的注册令牌发送邮件,GCM将照常处理请求,但它会在响应的registration_id field中包含规范ID。确保使用此规范ID替换存储在服务器中的注册令牌,因为最终旧注册令牌将停止工作。

根据此blog,GCM服务会在发送通知的顺序中返回通用ID。以下是一个示例回复:

{
    "multicast_id": 7036866281258904189,
    "success": 1,
    "failure": 0,
    "canonical_ids": 1,
    "results": [
        {
            "registration_id": "CANNONICAL_REGISTRATION_ID",
            "message_id": "0:1415529915241995%64ac3713f9fd7ecd"
        }
    ]
}

规范id = 0表示您的推送服务器使用的注册ID是正常的,不应该被规范ID替换,即GCM服务器通常会响应canonical_id = 0。 在示例响应中,有一个cannonical id,这意味着您的服务器必须替换您在响应中看到的新值的现有注册ID。如果用户重新安装您的客户端应用程序,这种情况很容易重现,但您的推送服务器不知道它,GCM服务器将通过响应新的注册ID。

检查有关规范ID的相关SO问题: