UNTimeIntervalNotificationTrigger nextTriggerDate()是否给出错误的日期? [英] Does UNTimeIntervalNotificationTrigger nextTriggerDate() give the wrong date?
问题描述
我正在更新本地通知以与iOS 10配合使用,但遇到了一个问题,我认为nextTrigger函数返回NOT下一次满足触发条件的日期。而是返回当前日期时间加上您最初设置的UNTimeInvervalNotificationTrigger的值。
I’m updating my localnotifications to work with iOS 10 and I’ve run into an issue where I think the nextTrigger function returns NOT "The next date at which the trigger conditions will be met." but instead returns whatever the current date time is PLUS what you had initially set the UNTimeInvervalNotificationTrigger to.
因此,如果您将触发器设置为在60秒内熄灭,请从文档中获取我希望当我调用nextTriggerDate()时,无论设置触发器+ 60秒时是什么日期时间,它都会返回它。因此,如果我将其设置为12:00:00,则我希望nextTriggerDate()为12:01:00。但是,我遇到的是,无论当前日期是+ 60秒,它都会返回。
So if you set the trigger to go off in 60 seconds, from the documentation I expect that when I call the nextTriggerDate() that I’d get it to return whatever the date time is when I set the trigger + 60 seconds. So if I set it at 12:00:00, I’d expect that the nextTriggerDate() would be 12:01:00. However what I’m experiencing is that it returns whatever the current date is + 60 seconds.
我写了一个示例,该示例安排了一个UNTimeIntervalNotificationTrigger,然后每秒打印出nextTriggerDate()。运行此命令时,我每秒都会得到一个新的nextTriggerDate。像这样:
I wrote a sample that schedules a UNTimeIntervalNotificationTrigger and then prints out the nextTriggerDate() every second. When I run this I get a new nextTriggerDate every second. Like this:
//Optional(2016-11-03 21:26:31 +0000)
//Optional(2016-11-03 21:26:32 +0000)
//Optional(2016-11-03 21:26:33 +0000)
//Optional(2016-11-03 21:26:34 +0000)
//Optional(2016-11-03 21:26:35 +0000)
//Optional(2016-11-03 21:26:36 +0000)
我用苹果开了一个TSI,但是……你知道……这需要一段时间。所以我想看看这里是否有人有任何见识。我怀疑这是一个错误,如果我获得更多信息,将对其进行更新。
I’ve opened a TSI with apple but… you know… that takes awhile. So I thought I’d see if anyone here had any insight. I suspect it’s a bug and if I get more information I’ll update this.
这是我用来说明问题的代码:
This is the code I’ve used to illustrate the issue:
import UIKit
import UserNotifications
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var setButton: UIButton!
@IBOutlet weak var timePicker: UIPickerView!
weak var timer: Timer?
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func setButtonAction(_ sender: UIButton) {
var mySecond = pickerSelection
// build notification
let content = UNMutableNotificationContent()
content.title = "Title of notification"
content.body = "This is the body of the notification"
content.sound = UNNotificationSound.default()
content.categoryIdentifier = "myCategory"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: Double(mySecond), repeats: false)
let request = UNNotificationRequest(identifier: "test notification", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) {(error) in
if let error = error {
print("Uh oh! We had an error: \(error)")
}
}
self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.tick), userInfo: nil, repeats: true)
}
let pickerData = [":00",":01",":02",":03",":04",":05",":06",":07",":08",":09",":10",":11",":12",":13",":14",":15",":16",":17",":18",":19",":20",":21",":22",":23",":24",":25",":26",":27",":28",":29",":30",":31",":32",":33",":34",":35",":36",":37",":38",":39",":40",":41",":42",":43",":44",":45",":46",":47",":48",":49",":50",":51",":52",":53",":54",":55",":56",":57",":58",":59"]
var pickerSelection = 0
override func viewDidLoad() {
super.viewDidLoad()
self.timePicker.dataSource = self
self.timePicker.delegate = self
self.timePicker.selectRow(pickerSelection, inComponent: 0, animated: false)
}
// The number of columns of data
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
// The number of rows of data
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
// The data to return for the row and component (column) that's being passed in
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerData[row]
}
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
let pickerLabel = UILabel()
let titleData = pickerData[row]
let myTitle = NSAttributedString(string: titleData, attributes: [NSFontAttributeName:UIFont(name: "Futura", size: 44.0)!])
pickerLabel.attributedText = myTitle
pickerLabel.textAlignment = .center
return pickerLabel
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
pickerSelection = row
}
func tick() {
let center = UNUserNotificationCenter.current()
center.getPendingNotificationRequests(completionHandler: { (scheduledLocalNotifications) in
for localNotice in scheduledLocalNotifications {
var localTrigger = localNotice.trigger as! UNTimeIntervalNotificationTrigger
var localTime = localTrigger.nextTriggerDate()
// ** This output shows something like this:
//Optional(2016-11-03 21:26:31 +0000)
//Optional(2016-11-03 21:26:32 +0000)
//Optional(2016-11-03 21:26:33 +0000)
//Optional(2016-11-03 21:26:34 +0000)
//Optional(2016-11-03 21:26:35 +0000)
//Optional(2016-11-03 21:26:36 +0000)
print("\(localTime)")
}
})
}
}
推荐答案
从Apple DTS那里听说,我被描述的功能就是它的工作方式。尽管我以为文档解释的方式有所不同,但他们告诉我文档对实现很乐观。无论如何,我通过在代码中跟踪触发日期来解决该问题。我希望这个答案可以对其他遇到与我一样的问题的人有所帮助。
Heard back from Apple DTS and was told that the functionality I'd described was how it was designed to work. Although I had thought the documentation explained it differently they told me that "the documentation was optimistic given the implementation." Anyway, I worked around it by keeping track of the fire date in my code. I hope this answer can help someone else who had the same problem I did.
这篇关于UNTimeIntervalNotificationTrigger nextTriggerDate()是否给出错误的日期?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!