Триггер UILocalNotification для каждые 14 дней (две недели) Swift
На вопрос уже ответили на SO. Вот ссылка:
Триггер уведомлений iOS: раз в две недели и / или ежеквартально
Но то, что я попробовал, так далеко:
var fortnightPart1 = DateComponents()
fortnightPart1.weekday = Calendar.current.component(.day, from: Sdate) //(Day..here Sunday)
fortnightPart1.weekdayOrdinal = 2 //= n == (nth Day in the month...here 2nd Sunday in every month month)
fortnightPart1.hour = Calendar.current.component(.hour, from: Sdate)
fortnightPart1.minute = Calendar.current.component(.minute, from: Sdate)
fortnightPart1.second = Calendar.current.component(.second, from: Sdate)
trigger = UNCalendarNotificationTrigger(dateMatching: fortnightPart1, repeats: repeate)
Я не могу этого добиться через 14 дней. Хотя речь идет о случайных данных. Кто-нибудь может проверить, что не так с кодом?
Обновить:
Согласно вашему предложению ( /questions/17614287/trigger-uilocalnotification-dlya-kazhdyie-14-dnej-dve-nedeli-swift/17614294#17614294), вот окончательный код, который сработал!
//for 1st time notification
let center = UNUserNotificationCenter.current()
let content = UNMutableNotificationContent()
content.title = title
content.body = body
content.categoryIdentifier = "\(id)"
content.sound = UNNotificationSound.default()
fortnightPart1.hour = Calendar.current.component(.hour, from: dateToFireON)
fortnightPart1.minute = Calendar.current.component(.minute, from: dateToFireON)
fortnightPart1.second = Calendar.current.component(.second, from: dateToFireON)
trigger = UNCalendarNotificationTrigger(dateMatching: fortnightPart1, repeats: false)
content.userInfo = ["NotificationID": id,"repeate":repeate,"resedule":true]
let request = UNNotificationRequest(identifier: "\(id)", content: content, trigger: trigger)
center.add(request)
//when first notification triggered, we need to set another for 14 days repeat in UIApplicationDelegate
func application(_ application: UIApplication, didReceive notification: UILocalNotification) {
let center = UNUserNotificationCenter.current()
let content = UNMutableNotificationContent()
content.title = notification.alertTitle!
content.body = notification.alertBody!
content.categoryIdentifier = "\(reminderId)"
content.userInfo = ["NotificationID": reminderId,"repeate":true,"resedule":false]
content.sound = UNNotificationSound.default()
let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 1209600, repeats: true)
let request = UNNotificationRequest(identifier:"\(reminderId)", content: content, trigger: trigger)
center.add(request, withCompletionHandler: nil)
}
2 ответа
То, чего вы хотите достичь, невозможно с помощью простого UNNotificationTrigger
s. Чтобы уведомление повторялось раз в две недели, вам необходимо настроить UNTimeIntervalNotificationTrigger
с timeInterval
эквивалентно двум неделям. Однако вы не можете указать первую дату срабатывания триггера временного интервала, он начинает "тикать", как только вы запланируете его.
С другой стороны, UNCalendarNotificationTrigger
можно запланировать запуск на определенную дату, но проблема в том, что вы не можете указать пользовательский интервал повторения для триггера уведомлений.
То, что вам нужно, это сначала установить неповторяющийся UNCalendarNotificationTrigger
на дату, указанную пользователем, и после того, как уведомление доставлено, установите UNTimeIntervalNotificationTrigger
это срабатывает каждые две недели. Единственная проблема с этим подходом заключается в том, что пользователь будет видеть уведомление и в указанную дату, а не только каждые две недели после этого. Однако вы можете обойти эту проблему, настроив доставку уведомлений через две недели после указанной даты, тогда пользователь не заметит разницу между уведомлениями.
@ Дэвид ответ очень прав. Я хочу добавить одну вещь здесь. Если пользователь не будет нажимать на уведомления, вы не можете запланировать другие уведомления. Вы можете использовать фоновую выборку для этого. Если IOS запускает фоновую загрузку, тогда сверяйте текущую дату с датами вашего расписания и генерируйте новые уведомления.