Отправка push-уведомления конкретному пользователю в Parse

#parse-platform #apple-push-notifications

#parse-платформа #apple-push-уведомления

Вопрос:

Я пытаюсь создать поток в облачном коде, где мне нужно отправить push-уведомление не пользователю, который только что зарегистрировался, а его партнеру.

В моем приложении два пользователя могут быть подключены как партнеры. В моей таблице пользователей есть partnerUser столбец, который указывает на его партнера. Итак, поток выглядит следующим образом:

1) Марк сначала регистрируется в приложении и добавляет адрес электронной почты Джона своего друга в качестве своего партнера 1.1) Функция afterSave вызывается, но ничего не делает, потому что у Марка еще нет партнера 2) Джон получает электронное письмо с кодом приглашения и регистрируется с помощью этого кода. Это соединяет их обоих в синтаксическом анализе 2.1) afterSave вызывается на основе функции save() Джона. Первое, что я делаю, это запрашиваю таблицу пользователей, чтобы найти партнера Джона — в данном случае Марка. Затем, имея объект Mark под рукой, я отправляю уведомление Mark.

Мои журналы не показывают никаких ошибок, но уведомление не достигает отметки. Не уверен, что я заполняю сам запрос.

Я меняю таблицу PFInstallation, чтобы иметь a Pointer для пользователя. И у меня также есть столбец в таблице User с installationId. С помощью этой связи я надеялся, что смогу отправить отдельное push-уведомление определенному пользователю. Это то, что я делаю в облачном коде:

 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);
                    }
                });
  

Просматривая мои журналы, я вижу:

[10.11.2016 21:06:32.870 PM] — Для пользователя Felipe сработало сохранение после сохранения

 [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
  

Я знаю, что push-уведомления работают, потому что у меня есть другой поток из облачной функции, который отправляет уведомление обоим пользователям, и они оба его получают. Но запрос основан на теме, а не на установке.

Какие-либо советы или рекомендации?

Спасибо

Ответ №1:

Я наконец нашел, в чем проблема. Это была эта строка:

 pushQuery.equalTo('installationId', request.object.get("installationId"));
  

на самом деле это принимает installationId от второго пользователя, а не от первого, как это должно было быть. Я изменил строку на:

 pushQuery.equalTo('installationId', userRetrieved.get("installationId"));
  

и теперь это работает