Android Parse.com 未发送推送通知
Android Parse.com push notification not sent
背景
我有一个 Android 应用程序,带有 工作接收器,可以接收从 iOS 设备和 Parse 网站发送的推送通知。
但是,以下情况不起作用:
- 将推送通知从 Android 发送到 Android
- 将推送通知从 Android 发送到 iOS
由于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
背景
我有一个 Android 应用程序,带有 工作接收器,可以接收从 iOS 设备和 Parse 网站发送的推送通知。
但是,以下情况不起作用:
- 将推送通知从 Android 发送到 Android
- 将推送通知从 Android 发送到 iOS
由于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