Разбирать push-уведомления конкретных пользователей Cloud Code

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

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

Parse.Cloud.define('addWinsLosses', function(request,response) { 

    Parse.Cloud.useMasterKey(); 

    var winnerUserId = request.params.winnerUserId;
    var loserUserId = request.params.loserUserId;

    var User = Parse.Object.extend('_User');
    var winner = new User({ objectId: winnerUserId });
    var loser = new User({ objectId: loserUserId });

    console.log(JSON.stringify(winner));
    console.log(JSON.stringify(loser));

    winner.increment('wins');
    loser.increment('losses');

    var pushQuery = new Parse.Query(Parse.Installation);

    pushQuery.equalTo('user', winner)

    Parse.Push.send({
        where: pushQuery
        data: {
            alert: "You Won!",
            badge: "increment"
        }
    }, {
        success: function () {
            response.success();
        },
        error: function (error) {
            response.error(error);
        }
    })

    var pushQuery = new Parse.Query(Parse.Installation);

    pushQuery.equalTo('user', loser)

    Parse.Push.send({
        where: pushQuery
        data: {
            alert: "You lost.",
            badge: 'increment'
        }
    }, {
        success: function () {
            response.success();
        },
        error: function (error) {
            response.error(error);
        }
    })

    Parse.Promise.when([winner.save(), loser.save()]).then(function () {
        // both saves have completed
        response.success();
    }, function (error) {
        // one or more errors
        console.log("Error in addWinsLosses : " + error.message);
        response.error(error);
    });
});

Я добавил необходимые отношения:

let installation = PFInstallation.currentInstallation()
            installation["user"] = PFUser.currentUser()
            installation.saveEventually()

Это должен быть указатель на PFUser, который затем сравнивается с другим указателем на PFUser в моем облачном коде, либо «победителем», либо «проигравшим». Сообщение отличается для двух пользователей.

Итак, несколько вопросов:

  1. Что не так с моим кодом?
  2. Как я могу очистить свой код, начиная с объединения "Parse.Push.send"?

person Wesley Cho    schedule 15.12.2015    source источник
comment
Рассмотрите возможность установки идентификатора пользователя (с некоторым префиксом) в качестве канала.   -  person Wain    schedule 16.12.2015


Ответы (1)


Вероятно, вам следует вызывать response.error() и response.success() только в последнем обратном вызове обещания. В противном случае облачная функция почти наверняка вернется преждевременно после отправки одного из push-уведомлений или после завершения сохранения пользовательских объектов (в зависимости от того, что завершится раньше).

Я бы попытался удалить обратные вызовы успеха/ошибки из вашего использования Parse.Push.send и вместо этого добавить объекты обещания, возвращаемые функцией, к вызову Parse.Promise.when:

var winnerPushPromise = Parse.Push.send({
    where: pushQuery
    data: {
        alert: "You Won!",
        badge: "increment"
    }
})

...

var loserPushPromise = Parse.Push.send({
    where: pushQuery
    data: {
        alert: "You lost.",
        badge: 'increment'
    }
})

var promises = [winnerPushPromise, loserPushPromise, winner.save(), loser.save()]

Parse.Promise.when(promises).then(function () {
...

ИЗМЕНИТЬ

Я только что заметил проблему с вашими пользовательскими объектами, которая может вызывать проблемы с вашим запросом — попробуйте изменить «objectId» на «id».

person Jake Krog    schedule 16.12.2015
comment
Должен ли я менять имя запроса для каждого нажатия? - person Wesley Cho; 17.12.2015
comment
Лично я бы создал переменную для каждого push-запроса, но не имеет значения, хотите ли вы повторно использовать переменную pushQuery (при условии, что вы обновляете запрос перед отправкой второго push-уведомления). - person Jake Krog; 18.12.2015