Android 从GCM 2.0迁移到GCM 3.0 InstanceID API

Android 从GCM 2.0迁移到GCM 3.0 InstanceID API,android,google-cloud-messaging,Android,Google Cloud Messaging,目前我已经在play store上发布了我的应用程序,我正在使用这个项目 compile 'com.google.android.gms:play-services:7.0.0' Google play services库版本7.0,在我的项目中使用Google云消息实现推送通知 Google play services库版本7.0使用register()方法使用旧的注册过程 GoogleCloudMessaging.register(SENDER_ID); 但谷歌的文件说 GCM regi

目前我已经在play store上发布了我的应用程序,我正在使用这个项目

compile 'com.google.android.gms:play-services:7.0.0'
Google play services库版本
7.0
,在我的项目中使用Google云消息实现推送通知

Google play services库版本
7.0
使用
register()
方法使用旧的注册过程

GoogleCloudMessaging.register(SENDER_ID);
但谷歌的文件说

GCM register()从2015年5月28日起不再推荐使用。新应用程序 开发应使用实例ID API来处理创建, 轮换和更新注册令牌

InstanceID API
包含在Google play services版本
7.5
中,因此我必须从
7.0
迁移到
7.5
或更高版本。但应用程序已经在使用
GCM register()
方法的play store上

我已经参考了这篇文章,它解释了如何使用
InstanceID
,但是我找不到任何从
GCM register()
迁移到
InstanceID

那么如何从
GCM register()
方法迁移到
InstanceID API


任何帮助都将不胜感激。

您只需实现
InstanceId API
,重新注册设备并将新ID存储在服务器上即可

这就是他们如何解释将应用程序从C2DM升级到GCM的迁移,而GCM的服务完全不同,因此这将有助于升级到最新的
GCM-API
InstanceId API


如果在发送通知时可以混合使用
instanceID
和旧的
regID
,您应该尝试一下(我找不到任何提示)。如果没有,您必须将布尔值或任何值与存储在服务器上的每个ID一起保存,以便能够区分您应该使用哪种方法向特定设备发送通知。

您应该在应用程序的build.gradle中添加GCM依赖项

compile 'com.google.android.gms:play-services-gcm:10.0.1'
然后在活动中,您应该在异步任务线程中添加一段代码

String authorizedEntity = PROJECT_ID; // Project id from Google Developer Console
String scope = "GCM";
String token = InstanceID.getInstance(context).getToken(authorizedEntity,scope);
LoginActivity.Java:

public class LoginActivity extends AppCompatActivity{

private String deviceToken;

@Override protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    setContentView(R.layout.activity_login_new);
    ButterKnife.bind(this);

      if (!NetworkHelper.checkActiveInternet(this)) {
        Methodutils.messageWithTitle(LoginActivity.this, "No Internet Connection",
            "Please check your internet connection.", v -> finish());
      } else {
        new RegisterDevice(false).execute();
      }
    }
  }

private class RegisterDevice extends AsyncTask<String, String, String> {
    private ProgressDialog dialog;

    @Override protected void onPreExecute() {
      super.onPreExecute();

      dialog = new ProgressDialog(LoginActivity.this);
      dialog.setMessage("loading...");
      dialog.setCancelable(false);
      dialog.show();
    }

    @Override protected String doInBackground(String... params) {
      try {

        String authorizedEntity = AppConstants.APP_ID;
        String scope = "GCM";

        deviceToken = InstanceID.getInstance(LoginActivity.this).getToken(authorizedEntity, scope);

        Log.e("New Device Token - ", deviceToken != null ? deviceToken : "NA");
        if (deviceToken != null) {
          return deviceToken;
        }
      } catch (IOException e) {
        e.printStackTrace();
      } catch (Exception e) {
        e.printStackTrace();
      }
      return null;
    }

    @Override public void onPostExecute(String result) {
      super.onPostExecute(result);
      if (dialog.isShowing) {
        dialog.dismiss();
      }
      if (result == null) return;
    }
  }

}
公共类LoginActivity扩展了AppCompatActivity{
私有字符串设备;
@重写受保护的void onCreate(Bundle savedInstance){
super.onCreate(savedInstance);
setContentView(R.layout.activity\u login\u new);
把(这个)绑起来;
如果(!NetworkHelper.checkActiveInternet(此)){
Methodutils.messageWithTitle(LoginActivity.this,“无互联网连接”,
“请检查您的internet连接。”,v->finish());
}否则{
新建RegisterDevice(false).execute();
}
}
}
私有类RegisterDevice扩展异步任务{
私人对话;
@重写受保护的void onPreExecute(){
super.onPreExecute();
dialog=新建ProgressDialog(LoginActivity.this);
setMessage(“加载…”);
对话框。可设置可取消(false);
dialog.show();
}
@覆盖受保护的字符串doInBackground(字符串…参数){
试一试{
字符串authorizedEntity=AppConstants.APP_ID;
字符串scope=“GCM”;
deviceToken=InstanceID.getInstance(LoginActivity.this).getToken(authorizedEntity,scope);
Log.e(“新设备令牌-”,deviceToken!=null?deviceToken:“NA”);
如果(deviceToken!=null){
返回装置停止;
}
}捕获(IOE异常){
e、 printStackTrace();
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
@重写公共void onPostExecute(字符串结果){
super.onPostExecute(结果);
if(dialog.isShowing){
dialog.dismise();
}
if(result==null)返回;
}
}
}

50分奖励,用于为您找到链接?您可以在回答中给出链接和适当的解释是的,但“首选项”中存储的注册id和我的应用程序的流程是什么?当用户登录时,它会注册到GCM服务器,然后用户可以使用应用程序,而无需登录,因此,如果使用新实例id API发布更新,则已登录用户无法注册到GCM服务器。第二个问题是,当我开始使用GCM 3.0时,google自动生成新的API密钥,但我已经为注册用户配置了旧的API密钥。后端pushnotification脚本是用C编写的,因此如何为GCM 2.0(已注册用户)和GCM 3.0(新用户)使用不同的API键?好的,解决方法是添加另一个首选项“hasUpdatedToInstanceId”,默认为false。在应用程序启动时,您可以检查此值并强制设备通过InstanceId重新注册。之后,将此首选项设置为true,您的工作流将照常继续。我不熟悉C,因此我恐怕无法向您提供代码示例,但我的想法是存储收到的Id是InstanceId还是旧RegId(将其作为附加参数从您的客户机传递到后端),如我在回答中所述。根据这些附加信息,您可以将通知拆分为两个请求,一个请求用于头中包含旧API密钥的旧ID,另一个请求用于头中包含新API密钥的实例ID。谢谢您的帮助。