2016-05-12 1 views
0

Je suis en train d'envoyer une notification Push par Parse code-Cloud lorsqu'un certain objet a été modifié - « sale »Parse envoyer une notification lorsque l'objet modifié

Je pense que je suis presque là, mais a reçu une erreur parce que je crois Je crée un nouvel utilisateur au lieu d'en demander un. J'ai trouvé this post lié à mon problème. Ma question est maintenant de savoir comment intégrer la requête de l'utilisateur dans mon bloc beforeSave. Idéalement, je créerais une autre fonction pour la requête utilisateur et la placerais dans mon bloc beforeSave.

** 5/14 Mise à jour J'ai suivi les conseils de @ toddg et j'ai corrigé la sauvegarde avant. Voici une image plus claire de ce que j'essaie de faire et de la nouvelle erreur.

Updating of the entry error

+0

Il est préférable de placer le code de notification après le bloc de sauvegarde. Dans le code ci-dessus, response.success() peut s'exécuter avant d'envoyer une notification push. Aussi le retour; l'empêche de notifier response.success() ou response.error(). Je recommande de déplacer les notifications à afterSave – Subash

+0

Quelle est l'erreur que vous obtenez d'ailleurs? – toddg

+0

Je recevais cette erreur - "Impossible de créer un pointeur vers un ParseObject non enregistré" – mparrish91

Répondre

0

A couple de points (comme @Subash noté dans les commentaires) avant d'entrer dans le code:

  1. Parse.Push.send est une opération asynchrone, de sorte que vous aurez envie de vous assurer appelez response.success() après l'envoi de votre envoi. Je vais traiter cela en utilisant Promises, car je pense qu'ils sont plus flexibles que les rappels. Si vous n'êtes pas familier, lisez à ce sujet here
  2. Le retour dans votre instruction if empêchera probablement l'appel de response.success().

Voici mon chemin recommandé de le faire:

Parse.Cloud.beforeSave("Fact", function(request, response) { 

    // Keep track of whether we need to send the push notification 
    var shouldPushBeSent = false; 

    var dirtyKeys = request.object.dirtyKeys(); 
    for (var i = 0; i < dirtyKeys.length; ++i) { 
    var dirtyKey = dirtyKeys[i]; 

    if (dirtyKey === "isValid") { 
     shouldPushBeSent = true; 
    } 
    } 

    if (shouldPushBeSent) { 

     //send push 
     // Creates a pointer to _User with object id of userId 

     var targetUser = new Parse.User(); 
     // targetUser.id = userId; 
     targetUser.id = request.object.userId; 

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

     // We want to pass the User object to the query rather than the UserId 
     query.equalTo('user', targetUser); 
     Parse.Push.send({ 
     where: query, // Set our Installation query 
     data: { 
      alert: "Your fact was approved" 
     } 
     }).then(function(){ 

     // Now we know the push notification was successfully sent 
     response.success(); 
     }, function(error){ 

     // There was an error sending the push notification 
     response.error("We had an error sending push: " + error); 
     }); 
    } else { 
    // We don't need to send the push notification. 
    response.success(); 
    } 
}); 

Soit dit en passant, je suppose que vous avez une colonne de votre classe d'installation qui suit l'utilisateur qui est associé à chaque installation.

+0

Merci pour la réponse rapide! Cela semble très bien, va le mettre en œuvre prochainement. J'ai une classe Installation, mais je n'ai pas de colonne userID ici. Est-ce ce que je devrais ajouter? Et puis je devrais envoyer ce userId de l'application iOS à Parse? – mparrish91

+0

pour les autres qui tentent d'ajouter une colonne à l'installation, très simple. voici comment je l'ai fait 'laisser user = PFUser.currentUser() laisser currentInstallation = PFInstallation.currentInstallation() currentInstallation.setObject ((utilisateur .objectId) !, forKey: "UserID") currentInstallation.saveInBackground() ' – mparrish91