重复通知间隔 [英] Repeat interval for UNNotification
问题描述
有一个选项可以设置UILocalNotification的重复间隔.由于Apple已弃用UILocalNotification并建议改用UNNotification,因此我找不到用UNNotification设置自定义重复间隔通知的方法.
There is an option to set the repeat interval for UILocalNotification. Since Apple has deprecated UILocalNotification and recommend to use UNNotification instead, I couldn't find a way to set a notification with custom repeat interval with UNNotification.
var comp = DateComponents()
comp.year = 2019
comp.month = 1
comp.day = 9
comp.hour = 14
comp.minute = 14
comp.second = 0
let calendar = Calendar.current
let notification: UILocalNotification = UILocalNotification()
notification.category = "Daily Quote"
notification.alertBody = "Body"
notification.alertTitle = "Title"
notification.fireDate = calendar.date(from: comp)
notification.repeatInterval = NSCalendar.Unit.day
UIApplication.shared.scheduleLocalNotification(notification)
那么我可以设置一个类似的通知,在使用新的UNNotification等待初始通知后每小时或每天重复一次吗?
So can I set a similar notification that repeats hourly or daily after waiting for the initial notification using the new UNNotification?
推荐答案
要模仿UILocalNotification的API fireDate
和repeatInterval
,您可以创建两个触发器,一个不重复,将用于fireDate
启动和repeatInterval
的其他重复.
To mimic the UILocalNotification's API fireDate
and repeatInterval
you can create two triggers, one non-repeating which would be used for fireDate
to kickoff and other repeating for repeatInterval
.
这是一个例子:
import UserNotifications
/// Schedules notificaiton to fire at specific date, and then it repeats by specified repeat component
/// (week, day, hour, etc.) and repeat interval. For example to repeat every 20minutes repeatComponent
/// would be .minute and repeatInterval would be 20.
/// - Parameters:
/// - fireDate: Date for initial notification delivery
/// - repeatComponent: Component by which repeating would be performed (week, day, hour, etc.)
/// - repeatInterval: Interval by which repeating by specified component would be performed. Defaults value is 1.
func scheduleNotification(fireDate: Date, repeatComponent: Calendar.Component, repeatInterval: Int = 1) {
let content = UNMutableNotificationContent()
content.title = "Daily Quote"
content.body = "Inspirational quote."
content.categoryIdentifier = "quote.category"
UNUserNotificationCenter.current().requestAuthorization(
options: [.alert,.sound])
{
(granted, error) in
if let error = error {
print("granted, but Error in notification permission:\(error.localizedDescription)")
}
let fireTrigger = UNTimeIntervalNotificationTrigger(timeInterval: fireDate.timeIntervalSinceNow, repeats: false)
let fireDateRequest = UNNotificationRequest(identifier: "quote.starter", content: content, trigger: fireTrigger)
UNUserNotificationCenter.current().add(fireDateRequest) {(error) in
if let error = error {
print("Error adding firing notification: \(error.localizedDescription)")
} else {
if let firstRepeatingDate = Calendar.current.date(byAdding: repeatComponent, value: repeatInterval, to: fireDate) {
let repeatingTrigger = UNTimeIntervalNotificationTrigger(timeInterval: firstRepeatingDate.timeIntervalSinceNow, repeats: true)
let repeatingRequest = UNNotificationRequest(identifier: "quote.repeater", content: content, trigger: repeatingTrigger)
UNUserNotificationCenter.current().add(repeatingRequest) { (error) in
if let error = error {
print("Error adding repeating notification: \(error.localizedDescription)")
} else {
print("Successfully scheduled")
// Successfully scheduled
}
}
}
}
}
UNUserNotificationCenter.current().delegate = self
}
}
委托(用于调试):
extension ViewController: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
print("\(notification.request.identifier): \(Date())")
UNUserNotificationCenter.current().getPendingNotificationRequests { (requests) in
for request in requests {
if let timeIntervalTrigger = request.trigger as? UNTimeIntervalNotificationTrigger {
print(Date(timeIntervalSinceNow: timeIntervalTrigger.timeInterval))
}
}
}
}
}
满足您的要求的用途:
let interval = 7 // One week from now
if let fireDate = Calendar.current.date(byAdding: .day, value: interval, to: Date()) {
_ = scheduleNotification(fireDate: fireDate, repeatComponent: .day)
}
注意
NOTE
指定小于60秒的重复间隔将导致以下异常:
Specifying repeating interval less than 60sec would result with exception:
"NSInternalInconsistencyException",原因:如果重复,时间间隔必须至少为60"
'NSInternalInconsistencyException', reason: 'time interval must be at least 60 if repeating'
这篇关于重复通知间隔的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!