Установить конкретное время и интервал для повторяющихся напоминаний
Я пытаюсь сделать Reminder, в котором пользователь выбирает сам время и интервал с помощью пикеров. Пример на картинке.
Проблема в том, что когда я использую UNTimeIntervalNotificationTrigger, я не могу использовать UNCalendarNotificationTrigger, и получается либо время, либо интервал.
Какие есть способы установить и то, и другое?
Спасибо
Вот код, который я использую для того, чтобы пользователь выбирал частоту уведомлений с помощью пикера.
var every = ""
var number = ""
var daysP = ""
var pickOption = [["Every"], ["1","2", "3","4","5","6","7","8","9","10"],["days"]]
@IBOutlet weak var picker: UIPickerView!
@IBOutlet weak var timePicker: UIDatePicker!
override func viewDidLoad() {
super.viewDidLoad()
picker.delegate = self
picker.delegate = self
let color1 = UIColor(red: 70/255, green: 115/255, blue: 99/255, alpha: 1)
picker.setValue(color1, forKey: "textColor")
}
@IBAction func setReminderBtnTapped(_ sender: Any) {
let content = UNMutableNotificationContent()
content.title = "Test"
content.body = "Blablabla"
content.categoryIdentifier = "flovers"
content.sound = .default
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: TimeInterval((picker.selectedRow(inComponent: 1)+1)*(24*3600)), repeats: true)
let request = UNNotificationRequest(identifier: "flovers.reminder", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { (error) in
if error != nil {
print("Error")
}
}
print("added notification:\(request.identifier)")
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return pickOption.count
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickOption[component].count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickOption[component][row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
every = pickOption[0][picker.selectedRow(inComponent: 0)]
number = pickOption[1][picker.selectedRow(inComponent: 1)]
daysP = pickOption[2][picker.selectedRow(inComponent: 2)]
}
}
Ответы (1 шт):
К сожалению, довольно проблематично сделать подобное на локальных нотификациях. Вы можете высчитать нужные даты и вручную задать несколько нотификаций (до 64). И при входе в приложение обновлять запросы на будущее.
Можете глянуть сторонние библиотеки, где подобное уже обработано, к примеру:
https://github.com/d7laungani/DLLocalNotifications
Но опять же, проблема ограниченного количества нотификаций.
Посмотрите в сторону EventKit, возможно впишется, с его помощью подобное сделать просто.
Можно использовать push notifications, но не для того, чтобы отправлять в заданное время уведомление (а что если пользователь будет без интернета / потеряется сообщение / еще чего?), а для обновления очереди локальных уведомлений.
Сценарий: пользователь установил напоминания и не заходит в приложение, очередь подходит к концу. Вы отправляете background notification и благодаря этому можете обновить очередь локальных уведомлений.
Но опять же, нет гарантии что они дойдут. Плюс, после force quit приложения это не поможет. Насколько помнится, система сама перезапускает когда надо только приложения использующие локацию.