向 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"));

现在可以使用了