Как я могу отправить локальное уведомление в определенное время (например, 9:00) в определенный день N, полученный из БД. Я попробовал таймер, чтобы добавить уведомление, но кажется, что таймер не работает, когда я сворачиваю приложение. Вот мой код:
func createTriggerLocalPushNotification(completion: @escaping(Error?) -> ()) {
var date = Date()
date.hour = 12
date.minute = 0
date.second = 0
var timeInterval = 86400 * 3 // Default 3 day
var timeBuffer:TimeInterval = 0
guard let inActivePushString = RealmUserInfo.shared.getValue(with: keyInActiveTimePush),
let inActivePushTime = Int(inActivePushString), inActivePushTime > 0 else {
log.info("Can't trigger inActivePushTime")
return
}
date.add(.day, value: inActivePushTime)
if #available(iOS 10.0, *) {
timeInterval = 86400 * inActivePushTime
timeBuffer = date.timeIntervalSinceNow
let content = UNMutableNotificationContent()
content.body = self.contentMessage
content.sound = UNNotificationSound.default
content.categoryIdentifier = self.inActiveTimePushNotificationCategory
// Buffer trigger when first time
var dateComponents = DateComponents()
dateComponents.day = Date().day + inActivePushTime
dateComponents.hour = 12
dateComponents.minute = 0
let firstTrigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)
let requestBuffer = UNNotificationRequest(identifier: self.bufferInActiveTimePushNotification, content: content, trigger: firstTrigger)
UNUserNotificationCenter.current().add(requestBuffer, withCompletionHandler: nil)
// Create content
Timer.scheduledTimer(withTimeInterval: timeBuffer, repeats: false) { (timer) in
// Create trigger
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: TimeInterval(timeInterval), repeats: true)
let request = UNNotificationRequest(identifier: self.inActiveTimePushNotification, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}
completion(nil)
} else {
// Fallback on earlier versions
let content = UILocalNotification()
content.alertBody = contentMessage
content.soundName = UILocalNotificationDefaultSoundName
content.category = inActiveTimePushNotification
content.fireDate = date
content.repeatInterval = .day
UIApplication.shared.scheduleLocalNotification(content)
completion(nil)
}
}





Установите локальное push-уведомление через 3 дня с определенным временем, например, 22:00, когда пользователь открывает приложение ИЛИ просто входит в приложение на переднем плане каждый раз, когда мы можем получить
applicationDidBecomeActive метод делегирования. В этом методе вам необходимо удалить старое локальное push-уведомление, если оно существует, и сбросить через 3 дня с определенным временем.
См. этот пост, чтобы установить локальное push-уведомление за N дней. Повторяющиеся локальные уведомления для определенных дней недели (Swift 3 IOS 10)
В этих статьях кажется, что мы можем получить компоненты даты по дням недели, дням и т. д., и это мне не помогает. В настоящее время я могу установить уведомление на следующий N день. Но я не знаю, как автоматически сбросить его. Вот так: var dateComponents = DateComponents() dateComponents.day = Date().day + 3 dateComponents.hour = 12 dateComponents.minute = 0 let firstTrigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, Repeats: false)