Android Parse.com推送通知接收不一致”;GCM-发送方ID不匹配“;错误

Android Parse.com推送通知接收不一致”;GCM-发送方ID不匹配“;错误,android,parse-platform,push-notification,Android,Parse Platform,Push Notification,来自parse.com的推送通知无法持续工作。随机推送通知将失败,导致GCM与发件人ID不匹配“错误。我的理解是,在编程上,我们不必对GCM做任何事情,因为parse.com将objectId发送给GCM。在这两种情况下,我都无法找出这个错误有时会发生,有时不会发生的具体原因。此外,我正在使用解析版本1.10.2 我的应用程序类有以下内容 Parse.initialize(this, APPLICATION_ID_DEBUG, CLIENT_KEY_DEBUG); Par

来自parse.com的推送通知无法持续工作。随机推送通知将失败,导致GCM与发件人ID不匹配“错误。我的理解是,在编程上,我们不必对GCM做任何事情,因为parse.com将objectId发送给GCM。在这两种情况下,我都无法找出这个错误有时会发生,有时不会发生的具体原因。此外,我正在使用解析版本1.10.2

我的应用程序类有以下内容

Parse.initialize(this, APPLICATION_ID_DEBUG, CLIENT_KEY_DEBUG);
            Parse.setLogLevel(Parse.LOG_LEVEL_VERBOSE);
ParsePush.subscribeInBackground(Constants.CHANNEL, new SaveCallback() {
            @Override
            public void done(ParseException e) {
                if (Utils.checkIfNull(e)) {
                    // subscribed to channel
                } else {
                    // failed to subscribe to channel
                }
            }
        });
用户登录到我的应用程序后,我会为他们附加一个频道。我保存的通道数据只是我从服务器获取的用户的唯一id

        List<String> arryChannel = new ArrayList<>();
        arryChannel.add(uniqueUserId);

        final ParseInstallation parseInstallation = ParseInstallation.getCurrentInstallation();
        parseInstallation.put(Constants.CHANNEL, arryChannel);
        parseInstallation.saveInBackground(new SaveCallback() {
            @Override
            public void done(ParseException e) {
                if (Utils.checkIfNull(e)) {
                    // update channel with user's unique id
                } else {
                    // failed to update channel with user unique id
                }
            }
        });
List arryChannel=new ArrayList();
arryChannel.add(uniqueUserId);
final ParseInstallation ParseInstallation=ParseInstallation.getCurrentInstallation();
parseInstallation.put(Constants.CHANNEL、arryChannel);
parseInstallation.saveInBackground(新的SaveCallback(){
@凌驾
公共作废完成(Parsee异常){
if(Utils.checkIfNull(e)){
//使用用户的唯一id更新频道
}否则{
//无法使用用户唯一id更新频道
}
}
});
最后,当用户注销时,我会从他们的频道取消订阅。我添加了unsubscribe以尝试阻止任何一台设备接收多个推送通知,因为它们已作为多个用户登录到应用程序并订阅了多个频道。以下是您注销时我的代码的外观

                    ParsePush.unsubscribeInBackground(Constants.CHANNEL, new SaveCallback() {
                        @Override
                        public void done(ParseException e) {
                            if (Utils.checkIfNull(e)) {
                                // successfully unsubscribed to channel

                                // save the updated (unsubscribed) parse installation
                                final ParseInstallation parseInstallation = ParseInstallation.getCurrentInstallation();
                                parseInstallation.put(Constants.CHANNEL, new ArrayList<String>());
                                parseInstallation.saveInBackground(new SaveCallback() {
                                    @Override
                                    public void done(ParseException e) {
                                        if (Utils.checkIfNull(e)) {
                                            // add whatever logs here to check for any issues with unsubscribing
                                        } else {
                                            // failed to update channel
                                        }
                                    }
                                });
                            } else {
                                Logger.e("PARSE", "failed to unsubscribed to channel: " + e.getMessage());
                            }
                        }
                    });
ParsePush.unsubscribeInBackground(Constants.CHANNEL,new SaveCallback()){
@凌驾
公共作废完成(Parsee异常){
if(Utils.checkIfNull(e)){
//已成功取消订阅频道
//保存更新(取消订阅)的解析安装
final ParseInstallation ParseInstallation=ParseInstallation.getCurrentInstallation();
parseInstallation.put(Constants.CHANNEL,new ArrayList());
parseInstallation.saveInBackground(新的SaveCallback(){
@凌驾
公共作废完成(Parsee异常){
if(Utils.checkIfNull(e)){
//在此处添加任何日志以检查取消订阅的任何问题
}否则{
//无法更新频道
}
}
});
}否则{
Logger.e(“解析”,“取消订阅频道失败:”+e.getMessage());
}
}
});

此实现的结果是,当推送通知不起作用时,它将继续失败约50-100次。然后它将开始工作大约150-200次。然后它又回到不工作的状态。这不是一个工作,不是来回的工作类型。它更多的是失败,失败,失败多次,然后是成功,成功,成功多次。对于我在实施过程中所缺少的任何帮助,我们都表示感谢。提前谢谢。

我终于找到了这个问题的答案!这个问题与我的执行无关。对于遇到相同冲突的任何其他人,请查找也使用推送通知的任何其他第三方服务。对我来说,Mixpanel是罪魁祸首。当我从代码库中删除mixpanel.initPushHandling()时,所有这些都开始工作。这是有意义的,因为在初始化mixpanel的推送通知时,会传入一个用于GCMSenderID的值。解析推送通知的工作方式不同。使用parse.com,您不必发送GCMSenderID,因为parse将自动发送objectId以执行推送通知。在这两者之间,这会导致GCM-MISHATCH-SENDER错误


因此,解决方案是,删除任何可能与parse.com冲突的服务。请随意使用我的实现,这很好。干杯

看看这个。我想这是正确的答案


我面对这个问题,经过仔细研究,终于找到了解决办法。正如Parse在文章中所说,如果除了Parse之外您还使用其他推送提供商,那么您应该提供应用程序用于推送消息的每个发件人ID。请看以下内容:

Parse Android SDK选择合理的默认配置,这样您就不必担心GCM注册ID、发送者ID或API密钥。特别是,SDK将在启动时使用Parse的发件人ID(1076345567071)自动注册应用程序以进行推送,并将生成的注册ID存储在应用程序当前Parse安装的deviceToken字段中

但是,作为希望从多个推送提供商发送推送的开发人员的高级功能,Parse允许您选择使用其他GCM发送者ID注册推送应用程序。要执行此操作,请在应用程序的AndroidManifest.xml中指定附加的GCM发送者ID,该ID带有以下
标记,作为
元素的子元素:

<meta-data android:name="com.parse.push.gcm_sender_id"
           android:value="id:YOUR_SENDER_ID" />;
在上面的示例代码段中,您的\u SENDER\u ID应替换为数字GCM SENDER ID。请注意,Parse SDK希望您使用ID:前缀作为发件人ID的前缀,如示例代码段中所示

如果你想用多个附加的发送者ID注册你的应用程序,那么android:value
<meta-data android:name="com.parse.push.gcm_sender_id"
           android:value="id:YOUR_SENDER_ID_1,YOUR_SENDER_ID_2,YOUR_SENDER_ID_3" />;