Как мне установить NSCalendarUnitMinute repeatInterval в iOS 10 пользовательских уведомлений?
В UILocalNotification мы используем NSCalendarUnitMinute
как повторение..... но я не могу найти в iOS 10 UserNotification doc... Как я могу использовать NSCalendarUnitMinute
как повторение в iOS 10 UserNotification
?
Вот код, который будет планировать местное уведомление на 8:30 вечера и будет повторяться через каждую минуту.
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = pickerDate;
localNotification.alertBody = self.textField.text;
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.repeatInterval = NSCalendarUnitMinute;
localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
3 ответа
Хотя кажется, что старая структура уведомлений имела лучшую поддержку в этом отношении, пока мы не поймем, что новая лучше!
У меня были похожие проблемы, и ниже приведен пример того, как старые уведомления могут идти рука об руку с новыми.
Чтобы быть на более безопасной стороне, это Swift2.3
,
// Retrieve interval to be used for repeating the notification
private func retrieveRepeatInterval(repeatTemp: RepeatInterval) {
switch repeatTemp {
case .Never:
if #available(iOS 10.0, *) {
toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Day, .Month, .Year], fromDate: timeTemp!)
toDateComponents.second = 0
repeatNotification = false
} else {
repeatIntervalTemp = nil
}
case .EveryMinute:
if #available(iOS 10.0, *) {
toDateComponents.second = 0
repeatNotification = true
} else {
repeatIntervalTemp = .Minute
}
case .EveryHour:
if #available(iOS 10.0, *) {
toDateComponents = NSCalendar.currentCalendar().components([.Minute], fromDate: timeTemp!)
toDateComponents.second = 0
repeatNotification = true
} else {
repeatIntervalTemp = .Hour
}
case .EveryDay:
if #available(iOS 10.0, *) {
toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute], fromDate: timeTemp!)
toDateComponents.second = 0
repeatNotification = true
} else {
repeatIntervalTemp = .Day
}
case .EveryWeek:
if #available(iOS 10.0, *) {
toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Weekday], fromDate: timeTemp!)
toDateComponents.second = 0
repeatNotification = true
} else {
repeatIntervalTemp = .WeekOfYear
}
case .EveryMonth:
if #available(iOS 10.0, *) {
toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Day], fromDate: timeTemp!)
toDateComponents.second = 0
repeatNotification = true
} else {
repeatIntervalTemp = .Month
}
case .EveryYear:
if #available(iOS 10.0, *) {
toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Day, .Month], fromDate: timeTemp!)
toDateComponents.second = 0
repeatNotification = true
} else {
repeatIntervalTemp = .Year
}
}
}
Хотя это не является исчерпывающим, я в значительной степени покрыл все от минуты до года.
И чтобы быть более подробным,
// RepeatInterval
enum RepeatInterval : String, CustomStringConvertible {
case Never = "Never"
case EveryMinute = "Every Minute"
case EveryHour = "Every Hour"
case EveryDay = "Every Day"
case EveryWeek = "Every Week"
case EveryMonth = "Every Month"
case EveryYear = "Every Year"
var description : String { return rawValue }
static let allValues = [Never, EveryMinute, EveryHour, EveryDay, EveryWeek, EveryMonth, EveryYear]
}
var repeatTemp: RepeatInterval?
var repeatIntervalTemp: NSCalendarUnit?
var timeTemp: NSDate?
var toDateComponents = NSDateComponents()
Поскольку это работает для меня, это должно, вероятно, для остальных из вас. Пожалуйста, попробуйте и дайте мне знать, если есть проблема.
И, для точного решения этого вопроса, я бы посоветовал ниже.
(Возможно, Apple не думала о таком сценарии, но с этим можно справиться)
- Расписание уведомлений на 8:30 вечера
- Когда уведомление активируется, удалите его и запланируйте другое уведомление с другим идентификатором для
NSCalendarUnitMinute
эквивалент показан выше. - Вуаля, это работает!! (Или не сделал?)
Использовать UNCalendarNotificationTrigger
с DateComponents
вместо NSCalendar
:
var date = DateComponents()
date.hour = 8
date.minute = 30
let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
let content = UNNotificationContent()
// edit your content
let notification = UNNotificationRequest(identifier: "myNotification", content: content, trigger: trigger)
Вы установили дату с DateComponents
экземпляр и укажите, должно ли уведомление повторяться с repeats
параметр UNCalendarNotificationTrigger
инициализатор.
UNCalendarNotificationTrigger Документация
Просто на голову, что в Apple Docs есть опечатка (по состоянию на 6/13). Если вы используете NSDateComponents
вместо DateComponents
, вам нужно будет явно бросить date as DateComponents
в dateMatching
параметр.
В ответ на ваш комментарий я не верю, что поведение, которое вы хотите (изменяя частоту повторных уведомлений), поддерживается UNCalendarNotificationTrigger
,
Потерпи меня, это мой первый пост.
Нам понадобился 1-минутный интервал повторения для нашего приложения в ios 10, и мы использовали в качестве обходного пути сочетание старой и новой инфраструктуры.
планирование повторяющихся локальных уведомлений со старыми:
UILocalNotification * ln = [[UILocalNotification alloc] init];
...
ln.repeatInterval = kCFCalendarUnitMinute;
ln.userInfo = @ {@ "alarmID":...}
...
[[UIApplication sharedApplication] scheduleLocalNotification: ln];
Это создаст и запланирует обычные повторяющиеся LN, которые будут отображаться как UNNotification с UNLegacyNotificationTrigger
Я использовал alarmID для соединения старого и нового фреймворка.
Пытаться:
UNUserNotificationCenter* center = [UNUserNotificationCenter
currentNotificationCenter];
[center getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {
NSLog(@"----------------- PendingNotificationRequests %i -------------- ", (int)requests.count);
for (UNNotificationRequest *req in requests) {
UNNotificationTrigger *trigger = req.trigger;
NSLog(@"trigger %@", trigger);
}
}];
- реагирование на действия и запуск уведомлений, манипулирование центром уведомлений:
В новой структуре методы UNUserNotificationCenter: willPresentNotification: didReceiveNotificationResponse:
- Запрос авторизации и регистрации категории я сделал для обеих платформ обычным способом.
Надеюсь это поможет