2015-11-05 95 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() { 

     } 

    } 
}