Android 从GCM 2.0迁移到GCM 3.0 InstanceID API
目前我已经在play store上发布了我的应用程序,我正在使用这个项目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
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。谢谢您的帮助。