向 Parse 中的特定用户发送推送通知
Sending push notification to specific user in Parse
我正在尝试在 Cloud Code 中创建一个流程,我需要在其中发送推送通知,而不是发送给刚刚注册的用户,而是发送给他的合作伙伴。
在我的应用程序中,两个用户可以作为合作伙伴连接。我的用户 table 有一个 partnerUser
列指向他的搭档。所以,流程是这样的:
1) Mark 首先在应用程序中注册并将他朋友的 John 电子邮件地址添加为他的合作伙伴
1.1) afterSave 函数被调用但什么都不做,因为 Mark 还没有伙伴
2) John 收到一封包含邀请码的电子邮件并使用该代码注册。这在 Parse 中将它们连接起来
2.1) afterSave是基于John的save()调用的。我做的第一件事是查询用户 table 以查找 John 的合作伙伴 - 在本例中为 Mark。然后,在 Mark 手边的对象上,我将通知推送给 Mark。
我的日志没有显示任何错误,但通知没有到达马克。不确定我是否正在处理查询本身。
我将 PFInstallation table 更改为 Pointer
给用户。我在用户 table 中也有一列带有 InstallationId。有了这种关系,我希望我可以将个人推送通知发送给某个用户。这是我在云代码中所做的:
Parse.Cloud.afterSave(Parse.User, function(request) {
console.log(displayTime() + " - AfterSave Triggered for user " + request.object.get("firstName"));
//Making sure the partners have been connected
if (typeof request.object.get("partnerUser") !== 'undefined' || request.object.get("partnerUser") !== null) {
var topicName = request.object.get("topicName");
//Searching for the partner (in this case the partner registered first)
query = new Parse.Query(Parse.User);
query.equalTo("objectId", request.object.get("partnerUser").id);
query.doesNotExist("topicName"); //we just want a partner that has not been connected yet
query.first({
success: function(userRetrieved) {
console.log(displayTime() + ' - Partner Retrieved - name :' + userRetrieved.get("firstName"));
//We need to send a push notification to the user that first signed up (in this case "userRetrieved")
//because that user is not connected to the topic that joins both users
console.log(displayTime() + " - Installation Id is: " + request.object.get("installationId"));
//var partnerTopicName = request.object.get("partnerUser").id;
var pushQuery = new Parse.Query(Parse.Installation);
pushQuery.equalTo('user', userRetrieved);
pushQuery.equalTo('installationId', request.object.get("installationId"));
Parse.Push.send({
where: pushQuery, // Set our Installation query
data: {
"aps": {
"content-available": 1,
"sound": "default",
"title": "Name Me",
"alert": "",
"type": "connect_push_notification_channel",
"topic": topicName
}
}
}, {
useMasterKey: true,
success: function() {
console.log(displayTime() + " - Push done with installationId " + request.object.get("installationId"));
},
error: function(err) {
console.error(displayTime() + " - Push error " + err);
}
});
查看我的日志我可以看到:
[11/10/2016 21:06:32.870 PM] - 为用户 Felipe
触发了 AfterSave
[11/10/2016 21:06:32.873 PM] - finished for: Felipe
[11/10/2016 21:06:33.24 PM] - Partner Retrieved - name :Gemma
[11/10/2016 21:06:33.24 PM] - Installation Id is: 2f4b6127-49d5-4586-84eb-595fbb1e3d6a
[11/10/2016 21:06:33.25 PM] - Object UpdateAt equals to Object CreatedAt
[11/10/2016 21:06:33.173 PM] - Push done with installationId 2f4b6127-49d5-4586-84eb-595fbb1e3d6a
[11/10/2016 21:06:33.313 PM] - AfterSave Triggered for user Gemma
[11/10/2016 21:06:33.313 PM] - finished for: Gemma
[11/10/2016 21:06:33.319 PM] - saved
我知道推送通知有效,因为我有另一个流,来自 Cloud Functions,将通知推送给两个用户,他们都收到了通知。但是查询是基于主题而不是安装。
有什么提示或建议吗?
谢谢
我终于找到问题所在了。是这一行:
pushQuery.equalTo('installationId', request.object.get("installationId"));
这实际上是从第二个用户那里获取 installationId,而不是从第一个用户那里获取 installationId。我将行更改为:
pushQuery.equalTo('installationId', userRetrieved.get("installationId"));
现在可以使用了
我正在尝试在 Cloud Code 中创建一个流程,我需要在其中发送推送通知,而不是发送给刚刚注册的用户,而是发送给他的合作伙伴。
在我的应用程序中,两个用户可以作为合作伙伴连接。我的用户 table 有一个 partnerUser
列指向他的搭档。所以,流程是这样的:
1) Mark 首先在应用程序中注册并将他朋友的 John 电子邮件地址添加为他的合作伙伴 1.1) afterSave 函数被调用但什么都不做,因为 Mark 还没有伙伴 2) John 收到一封包含邀请码的电子邮件并使用该代码注册。这在 Parse 中将它们连接起来 2.1) afterSave是基于John的save()调用的。我做的第一件事是查询用户 table 以查找 John 的合作伙伴 - 在本例中为 Mark。然后,在 Mark 手边的对象上,我将通知推送给 Mark。
我的日志没有显示任何错误,但通知没有到达马克。不确定我是否正在处理查询本身。
我将 PFInstallation table 更改为 Pointer
给用户。我在用户 table 中也有一列带有 InstallationId。有了这种关系,我希望我可以将个人推送通知发送给某个用户。这是我在云代码中所做的:
Parse.Cloud.afterSave(Parse.User, function(request) {
console.log(displayTime() + " - AfterSave Triggered for user " + request.object.get("firstName"));
//Making sure the partners have been connected
if (typeof request.object.get("partnerUser") !== 'undefined' || request.object.get("partnerUser") !== null) {
var topicName = request.object.get("topicName");
//Searching for the partner (in this case the partner registered first)
query = new Parse.Query(Parse.User);
query.equalTo("objectId", request.object.get("partnerUser").id);
query.doesNotExist("topicName"); //we just want a partner that has not been connected yet
query.first({
success: function(userRetrieved) {
console.log(displayTime() + ' - Partner Retrieved - name :' + userRetrieved.get("firstName"));
//We need to send a push notification to the user that first signed up (in this case "userRetrieved")
//because that user is not connected to the topic that joins both users
console.log(displayTime() + " - Installation Id is: " + request.object.get("installationId"));
//var partnerTopicName = request.object.get("partnerUser").id;
var pushQuery = new Parse.Query(Parse.Installation);
pushQuery.equalTo('user', userRetrieved);
pushQuery.equalTo('installationId', request.object.get("installationId"));
Parse.Push.send({
where: pushQuery, // Set our Installation query
data: {
"aps": {
"content-available": 1,
"sound": "default",
"title": "Name Me",
"alert": "",
"type": "connect_push_notification_channel",
"topic": topicName
}
}
}, {
useMasterKey: true,
success: function() {
console.log(displayTime() + " - Push done with installationId " + request.object.get("installationId"));
},
error: function(err) {
console.error(displayTime() + " - Push error " + err);
}
});
查看我的日志我可以看到:
[11/10/2016 21:06:32.870 PM] - 为用户 Felipe
触发了 AfterSave[11/10/2016 21:06:32.873 PM] - finished for: Felipe
[11/10/2016 21:06:33.24 PM] - Partner Retrieved - name :Gemma
[11/10/2016 21:06:33.24 PM] - Installation Id is: 2f4b6127-49d5-4586-84eb-595fbb1e3d6a
[11/10/2016 21:06:33.25 PM] - Object UpdateAt equals to Object CreatedAt
[11/10/2016 21:06:33.173 PM] - Push done with installationId 2f4b6127-49d5-4586-84eb-595fbb1e3d6a
[11/10/2016 21:06:33.313 PM] - AfterSave Triggered for user Gemma
[11/10/2016 21:06:33.313 PM] - finished for: Gemma
[11/10/2016 21:06:33.319 PM] - saved
我知道推送通知有效,因为我有另一个流,来自 Cloud Functions,将通知推送给两个用户,他们都收到了通知。但是查询是基于主题而不是安装。
有什么提示或建议吗?
谢谢
我终于找到问题所在了。是这一行:
pushQuery.equalTo('installationId', request.object.get("installationId"));
这实际上是从第二个用户那里获取 installationId,而不是从第一个用户那里获取 installationId。我将行更改为:
pushQuery.equalTo('installationId', userRetrieved.get("installationId"));
现在可以使用了