Android Parse.com推送通知未发送

时间:2015-01-07 01:01:04

标签: android parse-platform push-notification

背景

我的Android应用程序带有工作接收器,可以接收从iOS设备和Parse网站发送的推送通知。

但是,以下情况不起作用:

  • 从Android发送推送通知
  • 从Android发送推送通知

由于Android应用程序可以毫无问题地接收推送通知,我想我的逻辑/代码必须有发送推送通知的内容

问题描述

使用parsePush.sendInBackground(SendCallback)方法发送推送通知时,它不返回ParseException个。所以这意味着没有错误。

但是Parse Dashboard没有显示此推送通知,目标目标(在这种情况下是iOS或Android设备)没有得到任何结果。

在正常情况下,当通过Parse发送推送通知时,它将在仪表板中显示为推送历史记录(工作案例会这样做),但是当我尝试从Android设备发送推送时,它只是没有在仪表板中显示任何内容,推送永远不会送达。

代码

有问题的Android代码:

public void onShouldSendPushData(MessageClient messageClient, Message message, List<PushPair> pushPairs) {
        //TODO setup offline push notification
        Log.d(TAG, "Recipient not online. Should notify recipient using push");
        if (pushPairs.size() > 0 && !chatRecipient.isEmpty()) {
            PushPair pp = pushPairs.get(0);
            String pushPayload = pp.getPushPayload();

            ParsePush parsePush = new ParsePush();
            ParseQuery query = ParseInstallation.getQuery();
            ParseQuery userQuery = ParseUser.getQuery();
            userQuery.whereEqualTo("username", chatRecipient);
            query.whereMatchesQuery("user", userQuery);
            parsePush.setQuery(query);

            // JSON object for android push
            String alertString = getResources().getString(R.string.push_notification_msg);

            try {
                JSONObject data = new JSONObject();
                data.put("alert", String.format(alertString, chatRecipient));
                data.put("badge", "Increment");
                data.put("sound", "default");
                // pass the sender name as "title"
                data.put("title", ParseUser.getCurrentUser().getUsername());
                data.put("uri", "");
                data.put("SIN", pushPayload);

                parsePush.setData(data);
                parsePush.sendInBackground(new SendCallback() {
                    @Override
                    public void done(ParseException e) {
                        if (e == null) {
                            Log.i(TAG, String.format("Push notification to %s sent successfully", chatRecipient));
                        } else {
                            Log.e(TAG, String.format("Private chat push notification sending error: %s", e.getMessage()));
                        }
                    }
                });
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

正在运行的iOS代码:

- (void)message:(id<SINMessage>)message shouldSendPushNotifications:(NSArray *)pushPairs {
    // use parse to send notifications
    // send notifications
    NSLog(@"Recipient not online. Should notify recipient using push");
    if (pushPairs.count > 0 && userSelected != nil) {
        pushData = [[pushPairs objectAtIndex:0] pushData];
        pushPayload = [[pushPairs objectAtIndex:0] pushPayload];

        PFPush *push = [[PFPush alloc] init];
        PFQuery *query = [PFInstallation query];
        PFQuery *userQuery = [PFUser query];
        [userQuery whereKey:@"username" equalTo:userSelected];

        [query whereKey:@"user" matchesQuery:userQuery];
        [push setQuery:query];
        NSDictionary *data = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSString stringWithFormat:@"You have a new Message from %@", [PFUser currentUser].username], @"alert",
                              @"Increment", @"badge",
                              @"default", @"sound",
                              pushPayload, @"SIN",
                              nil];

        [push setData:data];
        [push sendPushInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
            if (succeeded) {
                NSLog(@"Push notification to %@ sent successfully.", userSelected);
            } else {
                NSLog(@"push notifications sending error: %@", error);
            }
        }];
    } else {
        NSLog(@"Error: No push pairs.");
    }

注意

我可以确认每次要发送推送通知时都会调用上面的代码,并且不会返回任何异常。我还可以确认push中打包的数据不是null。

我没有发布接收者的代码,因为这部分代码正在运行,并且不应对此问题采取任何措施。

iOS代码和Android代码基本相同,为什么Android中的发送推送功能不起作用?

更新

我将Parse SDK升级到1.8.2,其Logging选项设置为VERBOSE,但仍无法找到任何未发送推送通知的线索。

我甚至用Parse示例项目做了一个简单的项目,只有Login和send消息函数,它的发送消息功能仍然不能正常工作。太令人沮丧了。

1 个答案:

答案 0 :(得分:1)

我找到了原因。

这是JSON中的“uri”字段。

只要包含此字段(包含或不包含内容),Parse就会忽略通知,但您会收到非错误回调。

如果删除JSON中的“uri”字段,通知将变为正常。

我已经向Parse报告了这个错误,他们已经开始解决它了。

更新

根据Parse.com的回复,这是一个预期的功能,因此带有“uri”字段的通知将在服务器端被丢弃,因此不会被发送。

相关链接: https://developers.facebook.com/bugs/338005256408244