我的Android应用程序带有工作接收器,可以接收从iOS设备和Parse网站发送的推送通知。
但是,以下情况不起作用:
由于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消息函数,它的发送消息功能仍然不能正常工作。太令人沮丧了。
答案 0 :(得分:1)
我找到了原因。
这是JSON中的“uri”字段。
只要包含此字段(包含或不包含内容),Parse就会忽略通知,但您会收到非错误回调。
如果删除JSON中的“uri”字段,通知将变为正常。
我已经向Parse报告了这个错误,他们已经开始解决它了。
根据Parse.com的回复,这是一个预期的功能,因此带有“uri”字段的通知将在服务器端被丢弃,因此不会被发送。