Android Parse.com 未发送推送通知

Android Parse.com push notification not sent

背景

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

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

由于Android应用程序可以毫无问题地接收推送通知,我想我的logic/code发送推送通知一定有问题

问题描述

使用 parsePush.sendInBackground(SendCallback) 方法发送推送通知时,returns 没有 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,并将其日志记录选项设置为 VERBOSE,但仍然找不到任何线索,说明为什么没有发送推送通知。

我什至用 Parse 示例项目做了一个简单的项目,只有登录和发送消息功能,但它的发送消息功能仍然不起作用。好郁闷

找到原因了

就是JSON里面的"uri"字段。

只要包含此字段(包含或不包含内容),Parse 似乎就会忽略通知,尽管您会得到一个无错误回调。

如果您删除 JSON 中的 "uri" 字段,通知将变得正常。

我已将此错误报告给 Parse,他们已开始解决它。

更新

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

相关link: https://developers.facebook.com/bugs/338005256408244