Parse.com 推送通知无法始终如一地接收错误"GCM -MISMATCH SENDER ID"



来自parse.com的推送通知不一致工作。随机推送通知将失败,导致GCM - MISMATCH SENDER ID"错误。这是我的理解,在编程上我们不需要与GCM做任何事情,因为parse.com将objectId发送给GCM。在这两种情况下,我都无法确定为什么这个错误有时发生,有时不发生的任何具体原因。此外,我正在使用Parse版本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
                }
            }
        });

最后,当用户登出时,我取消订阅他们的频道。我添加了退订功能,试图防止任何一台设备收到多个推送通知,因为它们以多个用户身份登录应用程序并订阅了多个频道。以下是我的代码在您注销时的样子。

                    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());
                            }
                        }
                    });

这种实现的结果是,当推送通知不工作时,它将继续失败约50-100次。然后它将开始工作大约150-200次。然后又变回不工作。这不是工作,不是工作类型的来回。它更多的是失败,失败,多次失败,然后成功,成功,多次成功。我在我的实施中缺少的任何帮助都是赞赏的。

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

所以解决方案是,删除任何可能与parse.com冲突的服务。并且可以随意用我的实现,很不错。干杯!

我面对这个问题,经过一番摸索,终于找到了解决办法。正如Parse在它的文档中所说,你应该提供每个Sender_ID,你的应用程序用来推送消息,如果你使用另一个推送提供商除了Parse。请看下面:

Parse Android SDK选择了一个合理的默认配置,这样你就不必担心GCM注册id、发送者id或API密钥。特别是,SDK将在启动时使用Parse的发送者ID (1076345567071)自动注册您的应用程序,并将结果注册ID存储在应用程序当前ParseInstallation的deviceToken字段中。

然而,作为开发者想要从多个推送提供商发送推送的高级功能,Parse允许你选择使用额外的GCM发送者id来注册你的应用。要做到这一点,指定额外的GCM发送者ID与以下<meta-data>标签作为<application>元素的子在你的应用程序的AndroidManifest.xml:

<meta-data android:name="com.parse.push.gcm_sender_id"
           android:value="id:YOUR_SENDER_ID" />;

在上面的示例代码片段中,YOUR_SENDER_ID应该被一个数字GCM发送者ID替换。请注意,Parse SDK希望您使用ID:前缀作为发送方ID的前缀,如示例代码片段所示。

如果你想用多个额外的发送者id注册你的应用程序,那么上面的<meta-data>元素中的android:值应该包含一个以逗号分隔的发送者id列表,如下面的代码片段所示:

<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" />;

最新更新