2016-05-12 10 views
0

を変更したときに通知を送信する - 「汚い」解析オブジェクトが、私は、特定のオブジェクトが変更されたとき、解析クラウドコードをプッシュ通知を送信しようとしています

を私は信じているので、私は、私はほとんどそこだと思いますが、エラーを受信しました新しいユーザーを作成する代わりに、新しいユーザーを作成しています。

Parse.Cloud.beforeSave("Fact", function(request, response) { 
    var dirtyKeys = request.object.dirtyKeys(); 
    for (var i = 0; i < dirtyKeys.length; ++i) { 
    var dirtyKey = dirtyKeys[i]; 
    if (dirtyKey === "isValid") { 

     //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); 
     query.equalTo('user', targetUser); 

     Parse.Push.send({ 
     where: query, 
     data: { 
      alert: "Your Fact was approved :)" 
     } 
     }); 

     return; 
    } 
    } 
    response.success(); 
}); 

私の問題に関連するthis postが見つかりました。私の質問は、私のbeforeSaveブロックにユーザークエリを統合する方法です。理想的には、私はユーザクエリのための別の関数を作成し、それを私のbeforeSaveブロックに置きます。

** 5/14更新 @ toddgさんのアドバイスを受け取り、保存する前に修正しました。ここで私がやろうとしていることと新しいエラーの明確なイメージがあります。

Updating of the entry error

+0

保存ブロックの後に通知コードを挿入する方がよいでしょう。上のコードでは、push.success()はプッシュ通知を送信する前に実行される可能性があります。また、戻り値。 response.success()またはresponse.error()への通知を禁止します。 aftersaveにお知らせを転送することをおすすめします – Subash

+0

途中で何が起こっているのですか? – toddg

+0

私はこのエラーを受け取りました - 「保存されていないParseObjectへのポインタを作成できません」 – mparrish91

答えて

0

カップルポイント(@Subashはコメントで述べたように)私は、コードに入る前に:

  1. Parse.Push.sendは、非同期操作ですので、あなたはあなたを確保したいと思いますプッシュ送信完了後にresponse.success()に電話してください。私はPromisesを使ってこれを扱うつもりです。コールバックよりも柔軟性があると思います。あなたが使い慣れていない場合、それらについて読むhere
  2. ifステートメントの返信によって、response.success()が呼び出されない可能性があります。

ここではそれをやって、私のお勧めの方法です:ところで

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

、私はあなたがそれぞれのインストールに関連付けられているユーザーを追跡あなたのインストールクラスの列を持っていると仮定しています。

+0

迅速な対応をありがとう!これはすぐに実装するつもりです。私はインストールクラスを持っていますが、そこにはユーザーID列がありません。それは私が追加する必要がありますか?そして、そのユーザーIDをiOSアプリからParseに送信する必要がありますか? – mparrish91

+0

インストールにカラムを追加しようとしている他の人には、非常に簡単です。ここで私がやった方法です '聞かせてユーザー= PFUser.currentUser()currentInstallation = PFInstallation.currentInstallationを聞かせて () currentInstallation.setObject((ユーザー.objectId)!forKey:?! "ユーザーID") currentInstallation.saveInBackground() ' – mparrish91

関連する問題