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
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							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")
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								} 
							 |