我在这里提到
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;
}
答案 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问题: