我尝试在Parse Cloud服务中实施一次PUSH通知订阅。这是我的模特:
Installation.user
- 指向User
User
- team
(String
)Subscription
- email
(String
),status
(String
),user
(指向User
的指针)< / LI>
作为用户,我可以说 - 当email
的用户变为status
并且此用户位于我的team
时,向我的所有设备发送推送通知。用户可以拥有多个订阅。用户可以手动取消订阅(通过OS X,iOS,Android,...应用程序)或自动取消订阅 - 当用户收到PUSH通知时,订阅应自动取消。他可以再次订阅,没问题,但自动取消是必须的。这些订阅是基于用户的,用户可以在设备上看到它们。
我写了Parse Cloud函数,它由两部分组成。
发送推送
Parse.Push.send({
where : query,
data : pushData
},
{ success: function() {
response.success('OK');
}, error: function(err) {
console.log(err);
response.error({ error: err });
}});
这确实有效。我query
的作品和PUSH收到了。
删除订阅
deleteSubscriptionQuery.find({
success: function(objects) {
Parse.Object.destroyAll(objects, {
success: function() {
response.success('OK');
},
error: function(err) {
console.log(err);
response.error(err);
}
});
},
error: function(err) {
console.log(err);
response.error(err);
},
});
这确实有效。我的deleteSubscriptionQuery
正常工作并删除了正确的订阅。
结合在一起
Parse.Push.send({
where : query,
data : pushData
},
{ success: function() {
deleteSubscriptionQuery.find({
success: function(objects) {
Parse.Object.destroyAll(objects, {
success: function() {
response.success('OK');
},
error: function(err) {
console.log(err);
response.error(err);
}
});
},
error: function(err) {
console.log(err);
response.error(err);
},
});
}, error: function(err) {
console.log(err);
response.error({ error: err });
}});
这不起作用并报告成功。似乎问题出在Parse.Push.send
,即。 success
过早被召唤。我假设Parse.Push.send
并未真正发送通知,但只是安排通知,并在成功安排时调用success
。如果是,则应重命名为Parse.Push.schedule
。另外我假设它们是按照我的查询安排的(查询保存,而不是真正执行),因此,我怀疑这个解决方案因为以下原因而无法正常工作:
Parse.Push.send
- 保存我的query
并致电success
,Subscription
个对象将在success
,query
处理我的推送,执行query
并返回零对象,因为我已经删除Subscription
success
中的Parse.Push.send
个对象}}。我是对的吗?有谁知道Parse内部人员?如果我是对的,你建议我应该做些什么来实现基于自定义查询的一次性PUSH通知?
答案 0 :(得分:0)
以下是基于@ Wain提案的解决方案。
Subscription
个对象。User
包含在此查询中,因此,它与Subscription
个对象一起提取。Installation
个对象中的User
个对象进行单独的Subscription
查询。Installation
查询。Subscription
上删除已经提取的success
个对象。我可以安全地以这种方式删除Subscription
个对象,并且它不会干扰Installation
查询PUSH通知。是否按预期工作。
Parse.Cloud.define("status", function(request, response) {
//
// Input validation
//
if (!request.params.hasOwnProperty("status")) {
response.error("Missing status parameter");
return;
}
var statusQuo = request.params["status"]
if (!statusQuo.hasOwnProperty("email") || !statusQuo.hasOwnProperty("team") || !statusQuo.hasOwnProperty("status")) {
response.error("Invalid status dictionary");
return;
}
var status = statusQuo["status"]
if ( status != "Available" ) {
response.success('OK');
return;
}
var email = statusQuo["email"]
var team = statusQuo["team"]
Parse.Cloud.useMasterKey();
//
// Find subscriptions
//
var usersQuery = new Parse.Query(Parse.User);
usersQuery.equalTo('team', team);
var Subscription = Parse.Object.extend("Subscription");
var subscriptionsQuery = new Parse.Query(Subscription);
subscriptionsQuery.include('user');
subscriptionsQuery.equalTo('status', status);
subscriptionsQuery.equalTo('email', email);
subscriptionsQuery.matchesQuery('user', usersQuery);
subscriptionsQuery.find({
success: function(subscriptions) {
var users = subscriptions.map(function(subscription) {
return subscription.get('user');
});
//
// Query for notifications / installations
//
var query = new Parse.Query(Parse.Installation);
query.equalTo('channels', 'status');
query.containedIn('user', users);
//
// Push notifications data
//
var pushData = { 'status' : statusQuo };
var apsData = { 'sound' : '', 'alert' : email + ' became Available.' };
pushData['aps'] = apsData
Parse.Push.send({
where : query,
data : pushData
},
{ success: function() {
Parse.Object.destroyAll(subscriptions, {
success: function() {
response.success('OK');
},
error: function(err) {
console.log(err);
response.error(err);
}
});
}, error: function(err) {
console.log(err);
response.error({ error: err });
}});
}, error: function(err) {
console.log(err);
response.error(err);
}
});
});