You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

122 lines
4.5 KiB

/**
* DailyNotificationMaintenanceWorker.swift
* Daily Notification Plugin for Capacitor
*
* Handles background maintenance tasks for notifications
*/
import Foundation
import UserNotifications
/// Handles background maintenance tasks for the notification plugin
public class DailyNotificationMaintenanceWorker {
/// Shared instance for singleton access
public static let shared = DailyNotificationMaintenanceWorker()
private let notificationCenter = UNUserNotificationCenter.current()
private let powerManager = DailyNotificationPowerManager.shared
private init() {}
/// Performs maintenance tasks
public func performMaintenance() {
DailyNotificationLogger.shared.log(.info, "Starting maintenance tasks")
// Update battery status
_ = powerManager.getBatteryStatus()
// Clean up old notifications
cleanupOldNotifications()
// Reschedule missed notifications
rescheduleMissedNotifications()
DailyNotificationLogger.shared.log(.info, "Maintenance tasks completed")
}
private func cleanupOldNotifications() {
let cutoffDate = Date().addingTimeInterval(-Double(DailyNotificationConfig.shared.retentionDays * 24 * 60 * 60))
notificationCenter.getDeliveredNotifications { notifications in
let oldNotifications = notifications.filter { $0.date < cutoffDate }
if !oldNotifications.isEmpty {
let identifiers = oldNotifications.map { $0.request.identifier }
self.notificationCenter.removeDeliveredNotifications(withIdentifiers: identifiers)
DailyNotificationLogger.shared.log(
.info,
"Cleaned up \(identifiers.count) old notifications"
)
}
}
}
private func rescheduleMissedNotifications() {
notificationCenter.getPendingNotificationRequests { requests in
let now = Date()
for request in requests {
guard let trigger = request.trigger as? UNCalendarNotificationTrigger,
let nextTriggerDate = trigger.nextTriggerDate() else {
continue
}
// If the next trigger date is more than 24 hours in the past
if nextTriggerDate.timeIntervalSince(now) < -24 * 60 * 60 {
// Reschedule the notification
let content = request.content.mutableCopy() as! UNMutableNotificationContent
let newRequest = UNNotificationRequest(
identifier: request.identifier,
content: content,
trigger: trigger
)
self.notificationCenter.add(newRequest) { error in
if let error = error {
DailyNotificationLogger.shared.log(
.error,
"Failed to reschedule notification: \(error.localizedDescription)"
)
} else {
DailyNotificationLogger.shared.log(
.info,
"Successfully rescheduled notification: \(request.identifier)"
)
}
}
}
}
}
}
/// Schedules the next maintenance window
public func scheduleNextMaintenance() {
let trigger = UNTimeIntervalNotificationTrigger(
timeInterval: DailyNotificationConfig.SchedulingIntervals.normal,
repeats: true
)
let content = UNMutableNotificationContent()
content.title = "Maintenance"
content.body = "Performing notification maintenance"
content.sound = nil
let request = UNNotificationRequest(
identifier: "maintenance-window",
content: content,
trigger: trigger
)
notificationCenter.add(request) { error in
if let error = error {
DailyNotificationLogger.shared.log(
.error,
"Failed to schedule maintenance window: \(error.localizedDescription)"
)
} else {
DailyNotificationLogger.shared.log(.info, "Maintenance window scheduled")
}
}
}
}