UNTimeIntervalNotificationTrigger nextTriggerDate() дает неправильную дату?

Я обновляю свои локальные уведомления для работы с iOS 10, и я столкнулся с проблемой, когда я думаю, что функция nextTrigger возвращает НЕ "Следующая дата, при которой условия триггера будут выполнены", а вместо этого возвращает любую текущую дату и время. ПЛЮС, что вы изначально установили UNTimeInvervalNotificationTrigger.

Поэтому, если вы установите срабатывание триггера через 60 секунд, из документации я ожидаю, что когда я вызову nextTriggerDate(), я получу его, чтобы он возвращал любую дату и время, когда я установил триггер + 60 секунд. Поэтому, если я установлю его в 12:00:00, я ожидаю, что nextTriggerDate() будет 12:01:00. Однако, что я испытываю, это то, что он возвращает любую текущую дату + 60 секунд.

Я написал образец, который планирует UNTimeIntervalNotificationTrigger, а затем распечатывает nextTriggerDate() каждую секунду. Когда я запускаю это, я получаю новую nextTriggerDate каждую секунду. Как это:

            //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 с яблоком, но... вы знаете... это займет некоторое время. Поэтому я подумал, увижу ли я здесь кого-нибудь. Я подозреваю, что это ошибка, и если я получу больше информации, я обновлю это.

Вот код, который я использовал для иллюстрации проблемы:

импорт UIKit импорт UserNotifications

Класс ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { @IBOutlet слабый 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)")

        }
    })
}

}

1 ответ

Услышав ответ от Apple DTS, мне сказали, что описанная мною функциональность была разработана таким образом, чтобы она работала. Хотя я думал, что документация объясняет это по-другому, они сказали мне, что "документация была оптимистичной, учитывая реализацию". Во всяком случае, я работал над этим, отслеживая дату пожара в моем коде. Я надеюсь, что этот ответ может помочь кому-то еще, кто имел ту же проблему, что и я.

Другие вопросы по тегам