我們對多個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