Android 解析推送通知和新 GCM 生成错误的设备令牌并解析推送通知不起作用

Posted

技术标签:

【中文标题】Android 解析推送通知和新 GCM 生成错误的设备令牌并解析推送通知不起作用【英文标题】:Android parse push notification and new GCM generate wrong device token and parse push notification not working 【发布时间】:2015-07-29 06:26:44 【问题描述】:

简介:当我使用新的 GCM API 时,在解析安装表中未正确添加设备令牌。 现在将以下类型的设备令牌添加到 Parse 安装表中。

DeviceToken : |ID|1|:crGctxOB068:APA91bFgPRehabJcm9CYdS948iqX2_ppLj02CtbzmEHR0cfbuPooq5F--hqqvR9AH-Ez6MWMQON1Toc2DiNJTNdpRc3nmm3ukIpWJ1jHaXq0Iug6MoHbmCrb9U0ak2


详细说明

我使用了新的 GCM api 来获取注册 ID。 我需要那个 regId 供内部使用。

我使用了来自谷歌以下链接的代码:Google cloud messaging android

我注意到了一点。每当我启动应用程序解析时,都会正确获取 deviceToken。登录后,我在 mainActivity 的 onCreate 中使用以下代码更新“用户”字段

 ParseACL acl = new ParseACL();
 acl.setPublicReadAccess(true);
 acl.setPublicWriteAccess(true);

 ParseInstallation installation =     ParseInstallation.getCurrentInstallation();
    installation.setACL(acl);

    if (ParseUser.getCurrentUser() != null) 
        installation.put("user", ParseUser.getCurrentUser());
    
 installation.saveInBackground(new SaveCallback() 
        @Override
        public void done(ParseException e) 
            if (e == null) 
                Log.e("installation", "success");
                Log.i("parse", "token after save : " + ParseInstallation.getCurrentInstallation().getString("deviceToken"));
                ParsePush.subscribeInBackground("", new SaveCallback() 

                    @Override
                    public void done(ParseException e) 

                        if (e != null) 

                            Log.e("error: ", e.getLocalizedMessage());
                            e.printStackTrace();
                         else 

                            Log.e("subscribed: ", "to broadcast channel");
                            Log.i("parse", "token after subscribe : " + ParseInstallation.getCurrentInstallation().getString("deviceToken"));
                        
                    
                );

             else 
                Log.e("installation", "failed");
                e.printStackTrace();
            
        
    );

通常当上面的代码运行时,deviceToken 被更改为上面提到的令牌,这似乎是错误的。所以我的推送通知不起作用。

【问题讨论】:

如何验证 deviceToken 是否已更改且错误 当我的应用程序第一次运行时,我检查了安装表的 deviceToken 字段,它看起来没问题。登录后,当我将“用户”保存到安装时,deviceToken 字段将更改为上述令牌。注意:有时它也可以正常工作。 【参考方案1】:

我已经解决了问题。

我需要将 GCM 设备令牌传递给其他 Web 服务,因此我使用以下代码从 GCM 获取令牌。

 InstanceID instanceID = InstanceID.getInstance(getApplicationContext());
               String token = instanceID.getToken(CommonUtils.SENDER_ID,
                       GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

在从此代码解析中获取令牌后,设备令牌发生了变化。 因此,我没有使用上面的代码,而是使用以下代码来获取 deviceToken 并解决了这个问题。

ParseInstallation.getCurrentInstallation().getString("deviceToken");

【讨论】:

以上是关于Android 解析推送通知和新 GCM 生成错误的设备令牌并解析推送通知不起作用的主要内容,如果未能解决你的问题,请参考以下文章

亚马逊、解析、pushwoosh 和 Android 的默认 GCM 推送通知之间的区别?

是否可以要求 GCM 服务器无法向过期/过时的注册 ID 推送通知?

在 Android 上解析接收通知

GCM 推送通知导致 502 Bad Gateway

如何在推送通知 (GCM) android 中发送图像?

为啥 GCM 不在 android 设备中提供推送通知?