2015-11-05 94 views
0

我們對多個Android設備使用GCM。我們能夠使用GCM通知的一些設備(並非全部)最近未能收到GCM觸發器(GCM服務器返回未註冊)。Android GCM「未註冊」雖然getRegistrationId返回ID

但是,當我們在設備上調用getRegistrationId()函數時,我們會得到相同的註冊ID。

任何想法爲什麼服務器返回未註冊,而客戶端正在返回一個實際的ID?

+0

確保你完全實現了'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

回答

4

NotRegistered由GCM如果

  • 如果與GCM的客戶端應用程序註銷返回。
  • 如果客戶端應用程序自動取消註冊,如果用戶卸載應用程序可能會發生這種情況。例如,在iOS上,如果APNS反饋服務報告APNS令牌無效。
  • 如果註冊令牌過期(例如,Google可能決定刷新註冊令牌,或者iOS設備的APNS令牌已過期)。
  • 如果客戶端應用程序已更新,但新版本未配置爲接收消息。

該令牌不應該再使用。

在設備端,您應該調用InstanceID.getToken來獲取新令牌,然後將此新令牌發送到您的服務器以將消息發送到應用程序。

好像你正在使用legacy reg ids發送消息到你的設備。如果是這樣,你應該切換到使用InstanceID tokens發送消息到設備。

0

使用該代碼使用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() { 

     } 

    } 
}