解析推送通知不按时触发

时间:2014-12-22 18:34:21

标签: javascript ios parse-platform push-notification cloud-code

在我的应用程序中,用户创建一个警报,上传一个要解析的对象,并在他们选择的时间安排推送通知。我昨天工作了,但由于某种原因,在用户创建警报后立即触发通知。我无法弄清楚,我不记得改变任何事情。

以下是我创建通知的代码:

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




});

1 个答案:

答案 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个请求。如果您计划在未来扩展应用或增加受众群体,这可能很容易成倍增加。这可以追溯到第一个原因,从设备发送本地推送通知。

在通过云代码安排您想要的方式时,还需要考虑几件事情。

  1. 预定时间不能过去,未来可能长达两周
  2. 它可以是ISO 8601日期(基本上是国际公认的表示YYYY-MM-DD的方式),带有日期,时间和时区,如上例所示,或者它可以是表示a的数值UNIX纪元时间(秒)(UTC)
  3. 确保您安装了最新版本的Parse
相关问题