Parse.com 推送通知无法持续工作收到 "GCM -MISMATCH SENDER ID" 错误

Parse.com push notifications not consistently working receiving "GCM -MISMATCH SENDER ID" error

来自 parse.com 的推送通知未始终有效。随机推送通知将失败,导致 GCM - MISMATCH SENDER ID”错误。据我了解,我们不必以编程方式对 GCM 做任何事情,因为 parse.com 将 objectId 发送到 GCM。无论哪种情况,我无法查明此错误有时会发生而有时不会发生的任何具体原因。此外,我使用的是 Parse 版本 1.10.2。

我的应用程序 class 具有以下内容

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 次。然后它又回到不工作。这不是工作,非工作类型来回。它更多的是失败,失败,失败多次,然后是成功,成功,多次成功。感谢任何有关我在实施过程中遗漏的帮助。提前致谢。

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

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

我遇到了这个问题,经过一番翻找,终于找到了解决办法。正如 Parse 在它的 docs 中所说,如果您使用除 Parse 之外的其他推送提供程序,您应该提供您的应用程序用于推送消息的每个 Sender_ID。看看下面:

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

但是,作为希望从多个推送提供商发送推送的开发人员的一项高级功能,Parse 允许您有选择地注册您的应用程序以使用其他 GCM 发件人 ID 进行推送。为此,请使用以下 <meta-data> 标记指定额外的 GCM 发件人 ID 作为应用 AndroidManifest.xml:

<application> 元素的子元素
<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:value 应该包含一个 comma-delimited 发件人 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" />;