#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"));
и теперь это работает