2017-07-24 105 views
0

我正在使用heroku解析服务器应用并尝试根据mongodb中可用的用户数据向单个设备发送推送通知。我使用云功能如下表:通过heroku解析服务器在单个设备上发送推送通知

Parse.Cloud.define("iosPush", function(request, response) { 

var user = request.user; 
var params = request.params; 
var someKey = params.someKey 
var data = params.data 

var pushQuery = new Parse.Query(Parse.Installation); 
pushQuery.equalTo('deviceType', 'ios'); // targeting iOS devices only 
pushQuery.equalTo("someKey", someKey) 

Parse.Push.send({ 
    where: pushQuery, // Set our Installation query 
    data: data 
}, { success: function() { 
    console.log("#### PUSH OK"); 
}, error: function(error) { 
    console.log("#### PUSH ERROR" + error.message); 
}, useMasterKey: true}); 

response.success('success'); 
}); 

我打一个卷曲的请求,检查如推送通知 -

curl -X POST -H "X-Parse-Application-Id: myAppId" -H "X-Parse-Master-Key: masterkey" -H "Content-Type: application/json" -d { "where": { "user_id": "cedsGn98ja" }, "data": { "alert": "Hello, Parse!" } }

http://myapp.herokuapp.com/parse/functions/iosPush

推工作,但它是在所有设备上发送。我想要一种方式,以便我可以在单个设备上发送它。

谢谢...

+0

我试过这样 卷曲-X POST -H “X-解析,应用ID:myAppId” -H“X-Parse- Master-Key:masterkey“-H”Content-Type:application/json“-d'{”其中“:”用户“:{”__type“:”指针“,”className“:”_User“,”objectId“ :“cedsGn98ja”}},“data”:{“alert”:“new one2”}}'http://myapp.herokuapp.com/parse/functions/iosPush 但是还是一样。推送是在所有设备上发送的,而不是仅此用户 –

回答

0

someKey将成为所有用户的独特之处?如果不是,您的推送应该发送到具有该匹配密钥的所有安装。为了发送给特定用户,您需要为安装对象上的user字段添加查询约束。这可能是唯一的查询约束条件,如果您想将其发送给所有用户的设备,或者您可以使用deviceId或installationId来定位特定设备。

+0

谢谢。你能解释我应该如何写安装ID的查询?我尝试像“where”:{“user”:“instalation_id”}但它没有奏效。你也可以解释如何使用某些键? –

+0

问题在于“where”条件无效。我尝试了一切,但推送发送给所有用户。 –

0

我用下面的代码发送用户1的通知给用户1进行测试。您需要修改'someKey'以针对您的用例的特定用户。不要忘记在您的应用程序代理中使用link your installation to the user

迅速

let text = "\(PFUser.current()!.username!) followed you, or whatever you want this to say"; 
let data = [ 
     "badge" : "Increment", 
     "alert" : text, 
    ] 
    let request: [String : Any] = [ 
     "someKey" : PFUser.current()!.objectId!, 
     "data" : data 
    ] 
    print(PFUser.current()!.objectId!) 
    print("sending push notification...") 
    PFCloud.callFunction(inBackground: "pushToFollowers", withParameters: request as [NSObject : AnyObject], block: { (results:AnyObject?, error:NSError?) in 
     print("push \(String(describing: results!))") 
     if error == nil { 
      print (results!) 
     } 
     else { 
      print (error!) 
     } 
    } as? PFIdResultBlock) 

云代码

Parse.Cloud.define("pushToFollowers", function (request, response) { 
    console.log("Inside pushToFollowers"); 
    var params = request.params; 
    var user = request.user; 
    var sessionToken = user.getSessionToken(); 
    var someKey = request.someKey; 
    var data = params.data; 

// Set our query to target specific user 
    var recipientUser = new Parse.Query(Parse.User); 
    recipientUser.equalTo("objectId", request.params.someKey); 

// Set our installation query 
    var pushQuery = new Parse.Query(Parse.Installation); 
    pushQuery.equalTo('deviceType', 'ios'); 
    pushQuery.matchesQuery('user', recipientUser); 
    pushQuery.find({ useMasterKey: true }).then(function(object) { 
     response.success(object); 
     console.log("pushQuery got " + object.length); 
     }, function(error) { 
      response.error(error); 
      console.error("pushQuery find failed. error = " + error.message); 
    }); 

    // Send push notification to query 
    Parse.Push.send({ 
    where: pushQuery, 
    data: data 
    }, { useMasterKey: true }) 
    .then(function() { 
     // Push sent! 
     console.log("#### push sent!"); 
    }, function(error) { 
     // There was a problem :(
     console.error("#### push error" + error.message); 
    }); 
response.success('success, end of pushToFollowers') 
}); 
+0

@ s.jain如果这对您有用,请接受答案。干杯! – brewswane