我们对多个Android设备使用GCM。我们能够使用GCM通知的一些设备(并非全部)最近未能收到GCM触发器(GCM服务器返回未注册)。Android GCM“未注册”虽然getRegistrationId返回ID
但是,当我们在设备上调用getRegistrationId()函数时,我们会得到相同的注册ID。
任何想法为什么服务器返回未注册,而客户端正在返回一个实际的ID?
我们对多个Android设备使用GCM。我们能够使用GCM通知的一些设备(并非全部)最近未能收到GCM触发器(GCM服务器返回未注册)。Android GCM“未注册”虽然getRegistrationId返回ID
但是,当我们在设备上调用getRegistrationId()函数时,我们会得到相同的注册ID。
任何想法为什么服务器返回未注册,而客户端正在返回一个实际的ID?
NotRegistered由GCM如果
- 如果与GCM的客户端应用程序注销返回。
- 如果客户端应用程序自动取消注册,如果用户卸载应用程序可能会发生这种情况。例如,在iOS上,如果APNS反馈服务报告APNS令牌无效。
- 如果注册令牌过期(例如,Google可能决定刷新注册令牌,或者iOS设备的APNS令牌已过期)。
- 如果客户端应用程序已更新,但新版本未配置为接收消息。
该令牌不应该再使用。
在设备端,您应该调用InstanceID.getToken来获取新令牌,然后将此新令牌发送到您的服务器以将消息发送到应用程序。
好像你正在使用legacy reg ids发送消息到你的设备。如果是这样,你应该切换到使用InstanceID tokens发送消息到设备。
使用该代码使用asynk任务
public class MainActivity extends Activity {
String token;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new AsyncTaskRunner().execute();
}
private class AsyncTaskRunner extends AsyncTask<String, String, String> {
private String resp;
@Override
protected String doInBackground(String... params) {
InstanceID instanceID = InstanceID.getInstance(MainActivity.this);
try {
token = instanceID.getToken(
getString(R.string.gcm_defaultSenderId),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
((TextView) findViewById(R.id.text1)).setText(token);
}
@Override
protected void onPreExecute() {
}
}
}
确保你完全实现了'getRegistrationId'获得注册ID。请查看[这里](https://github.com/google/gcm/blob/399e88c1ef5bb95395b6392f9061e45b2fb5d49a/samples/android/gcm-demo/src/main/java/com/google/android/gcm/demo/logic/InstanceIdHelper。 java#L55-L98),比较它。 – bjiang