未从 LocalNotification.fireDate 收到通知

Posted

技术标签:

【中文标题】未从 LocalNotification.fireDate 收到通知【英文标题】:Not getting notifications from LocalNotification.fireDate 【发布时间】:2014-12-10 17:29:55 【问题描述】:

为什么按下按钮后不显示通知?

如果 fireDate 是 NSDate(timeIntervalSinceNow: 10) 它会正常工作

如何从数组中获取通知?

    @IBAction func buttonPressed(sender: AnyObject) 

    var stringDate = dateFormatter.stringFromDate(timePicker.date)
    alarmArray.append(stringDate)

    let fixedAlarmArray = alarmArray
    NSUserDefaults.standardUserDefaults().setObject(fixedAlarmArray, forKey: "alarmArray")
    NSUserDefaults.standardUserDefaults().synchronize()


    //Local Notification
    var localNotification:UILocalNotification = UILocalNotification()
    localNotification.alertAction = "Go to app"
    localNotification.alertBody = "Its Time!"
    localNotification.fireDate = timePicker.date
    localNotification.timeZone = NSTimeZone.defaultTimeZone()
    UIApplication.sharedApplication().scheduleLocalNotification(localNotification)

    self.view.endEditing(true)


【问题讨论】:

【参考方案1】:

fireDate中指定的日期根据值进行解释 这个属性的。如果您指定 nil(默认值),则触发日期为 解释为绝对 GMT 时间,适用于此类情况 作为倒计时。如果您为此分配一个有效的 NSTimeZone 对象 属性,火灾日期被解释为挂钟时间,即 时区变化时自动调整;一个 适合这种情况的例子是闹钟。

localNotification.fireDate = timePicker.date
localNotification.timeZone = NSTimeZone.defaultTimeZone()
// the problem is here, you are setting the timezone after inputing your date

你应该使用 localtimeZone 并在设置 fireDate 之前设置它

localNotification.timeZone = NSTimeZone.localTimeZone()
localNotification.fireDate = timePicker.date

注意:

ios 8 及更高版本中,使用本地或远程通知的应用 必须注册他们打算发送的通知类型。这 系统然后赋予用户限制类型的能力 您的应用显示的通知。系统没有徽章图标, 显示警报消息,或播放警报声音(如果有) 未为您的应用启用通知类型,即使它们已启用 在通知负载中指定。

这样做:

UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Badge | UIUserNotificationType.Sound | UIUserNotificationType.Alert, categories: nil))

创建一个扩展,将选取的时间与 0 秒结合起来,如下所示:

extension NSDate 

    var day:            Int  return NSCalendar.currentCalendar().components(NSCalendarUnit.CalendarUnitDay,           fromDate: self).day           
    var month:          Int  return NSCalendar.currentCalendar().components(NSCalendarUnit.CalendarUnitMonth,         fromDate: self).month         
    var year:           Int  return NSCalendar.currentCalendar().components(NSCalendarUnit.CalendarUnitYear,          fromDate: self).year          
    var minute:         Int  return NSCalendar.currentCalendar().components(NSCalendarUnit.CalendarUnitMinute,        fromDate: self).minute 
    var hour:           Int  return NSCalendar.currentCalendar().components(NSCalendarUnit.CalendarUnitHour,          fromDate: self).hour   

    var fireDate: NSDate 
        return NSCalendar.currentCalendar().dateWithEra(1, year: year, month: month, day: day, hour: hour, minute: minute, second: 0, nanosecond: 0)!
    

然后按如下方式使用它:

localNotification.fireDate = timePicker.date.fireDate

【讨论】:

通知类型已注册,日期选择器模式设置为时间而非日期。如果 fireDate 设置为某个时间间隔,它确实有效,但在使用时间选择器时无效。问题是我如何正确使用时间选择器。 我已经更新了答案。问题是您在设置 fireDate 之后设置时区。 它实际上并没有什么不同,但我确实意识到我确实不是在确切的分钟,几秒钟后收到通知,这取决于我访问时间选择器的秒数,它将开始计数那一秒。 它肯定会选择实际的本地时间秒数。如果需要,您可以将日期选择器时间与自定义时间结合起来。 如果我访问时间选择器时的时间是晚上 10:15:30,并且我将闹钟设置为晚上 10:16,它会在晚上 10:16:30 通知我。我希望它在到达晚上 10:16 而不是我访问时间选择器的时间时立即通知我。

以上是关于未从 LocalNotification.fireDate 收到通知的主要内容,如果未能解决你的问题,请参考以下文章

SDWebImage 库未从缓存加载图像

未从 crontab 设置路径

未从 Dropbox 检索图像

以编程方式构建 - 未从程序集中加载“TransformTemplates”任务

未从 LocalNotification.fireDate 收到通知

未从 IntentService 调用 onLocationChanged