在我的应用程序中,用户创建一个警报,上传一个要解析的对象,并在他们选择的时间安排推送通知。我昨天工作了,但由于某种原因,在用户创建警报后立即触发通知。我无法弄清楚,我不记得改变任何事情。
以下是我创建通知的代码:
PFUser *user = [PFUser currentUser];
PFObject *alarm = [PFObject objectWithClassName:@"Alarm"];
alarm[@"Active"] = @YES;
alarm[@"Bounty"] = IntNumber;
alarm[@"ActionComplete"] = [NSNumber numberWithInt:0];;
alarm[@"Time"] = _alarmTime;
alarm[@"User"] = [PFUser currentUser];
NSLog(@"%@",_alarmTime);
NSString *dateString = [NSString stringWithFormat:@"%f",[_alarmTime timeIntervalSince1970] * 1000];
NSString *clientId = [[PFUser currentUser] objectId];
NSLog(@"%@",dateString);
alarm[@"aString"] = dateString;
[alarm save];
NSString *objectID = [alarm objectId];
[PFCloud callFunctionInBackground:@"sendSilentPush"
withParameters:@{
@"clientId":clientId,
@"alarmTime":dateString,
@"alarmTimeDate":_alarmTime,
}
block:^(id object, NSError *error) {
}];
这是我的云代码:
Parse.Cloud.define("sendSilentPush", function(request,response){
//Get user Id
var recepeintId = request.params.clientId;
var alarmTime = request.params.alarmTime;
var alarmTimeDate = request.params.alarmTimeDate;
//Get User hook using the ID using a query on user table
var userQuery = new Parse.Query('_User');
userQuery.get(recepeintId, {
success: function(user) {
// object is an instance of Parse.Object.
var pushQuery = new Parse.Query(Parse.Installation);
pushQuery.equalTo('deviceType', 'ios');
//Send a push to the user
Parse.Push.send({
where: pushQuery,
"data" : { "content-available": 1,
"sound": "",
"extra": { "Time": alarmTime }
}
}).then(function() {
response.success("Push was sent successfully.")
}, function(error) {
response.error("Push failed to send with error: " + error.message);
});
},
error: function(user, error) {
// error is an instance of Parse.Error.
}
});
});
答案 0 :(得分:3)
杰克我从头开始构建时无法复制你的错误。我可能会忽略一些我已在下面概述的内容。如果你的死机使用Cloud Code,则发送预定推送的正确方法如下。但首先让我们讨论,因为我无法重现你的错误,在这种情况下头脑风暴可能会占上风。
var query = new Parse.Query(Parse.Installation);
query.equalTo('deviceType', 'ios');
Parse.Push.send({
where: query,
"data" : { "content-available": 1,
"sound": "",
"extra": {"Time": alarmTime} //confused what your trying to do here.
}
//remaining code
extra 不是数据字典的受支持字段。除非你创建了自己的,但我没有在你的代码中看到其他任何地方。而且我不知道为什么要为它创建一个新词典呢?此外,如果您确实想要创建新字段,则只有在用户在点击通知后打开应用程序时才会显示数据。
使用云代码修正语法
var query = new Parse.Query(Parse.Installation);
query.equalTo('deviceType', 'ios');
Parse.Push.send({
where: query,
data : {
alert: "Push from the Future!",
badge: "Increment",
sound: "",
}
push_time: new Date(2015, 01, 01) // Can't be no more than two weeks from today see notes below
}, {
success: function() {
//Success
},
error: function(error) {
//Oops
}
});
但是,除非您绝对必须,否则我会敦促您不要使用Cloud Code。还有其他方法可以触发本地推送通知,特别是苹果方式。它用户友好,易于合并用于此类任务。另一个原因是,因为对于您执行的每个查询,它都会将您的API请求计为1个请求。如果您计划在未来扩展应用或增加受众群体,这可能很容易成倍增加。这可以追溯到第一个原因,从设备发送本地推送通知。
在通过云代码安排您想要的方式时,还需要考虑几件事情。