Sobes.tech
Middle

Ako zabezpečiť pokračovanie chodu aplikácie na pozadí?

sobes.tech AI

Odpoveď od AI

Na zabezpečenie prevádzky aplikácie na pozadí sa používajú rôzne mechanizmy iOS, v závislosti od typu úlohy:

  • Režimy na pozadí (Background Modes): Ide o vopred definované systémové režimy, ktoré umožňujú vykonávať určité operácie na pozadí. Najbežnejšie:

    • audio: Prehrávanie alebo nahrávanie zvuku.
    • location: Sledovanie polohy.
    • voip: Práca s VoIP.
    • fetch: Pravidelné sťahovanie nového obsahu.
    • processing: Vykonávanie náročných úloh.
    • remote-notification: Spracovanie push oznámení.

    Na aktiváciu režimov na pozadí je potrebné pridať príslušné kľúče do Info.plist alebo použiť Capabilities v Xcode.

  • Úloha na pozadí (Background Task): Umožňuje získať obmedzené obdobie na dokončenie aktuálnej úlohy po prechode aplikácie do režimu na pozadí.

    var backgroundTask: UIBackgroundTaskIdentifier = .invalid
    
    func registerBackgroundTask() {
        backgroundTask = UIApplication.shared.beginBackgroundTask {
            // Spracovanie vypršania času
            self.endBackgroundTask()
        }
        // Vykonanie úlohy na pozadí
        // ...
    }
    
    func endBackgroundTask() {
        UIApplication.shared.endBackgroundTask(backgroundTask)
        backgroundTask = .invalid
    }
    
  • Fetch na pozadí (Background Fetch): Umožňuje systému periodicky spúšťať aplikáciu na pozadí na kontrolu a sťahovanie nového obsahu.

    // V AppDelegate, v didFinishLaunchingWithOptions
    UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum)
    
    // V didFinishLaunchingWithOptions alebo v samostatnej metóde
    func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        // Vykonávame asynchrónne načítanie dát
        // Po dokončení voláme completionHandler s príslušným výsledkom:
        // .newData, .noData, .failed
        completionHandler(.newData)
    }
    
  • Spracovanie na pozadí (Background Processing): Určené na vykonávanie náročných úloh, ktoré môžu trvať dlhý čas. Používa sa s BGTaskScheduler.

    import BackgroundTasks
    
    let taskID = "com.yourapp.mytask"
    
    func registerBackgroundTasks() {
        BGTaskScheduler.shared.register(forTaskWithIdentifier: taskID) { task in
            // Vykonanie úlohy
            self.handleBackgroundTask(task: task as! BGProcessingTask)
        }
    }
    
    func handleBackgroundTask(task: BGProcessingTask) {
        // Vykonanie dlhodobej úlohy
        // Označenie úlohy ako dokončenej
        task.setTaskCompleted(success: true)
    }
    
    // Plánovanie úlohy
    func scheduleBackgroundProcessingTask() {
        let request = BGProcessingTaskRequest(identifier: taskID)
        // Nastavenie požiadaviek na prostredie (napríklad dostupnosť siete, nabíjanie batérie)
        request.requiresNetworkConnectivity = true
    
        do {
            try BGTaskScheduler.shared.submit(request)
        } catch {
            print("Nepodarilo sa naplánovať úlohu: \(error)")
        }
    }
    
  • Push notifikácie: Tiché push notifikácie môžu byť použité na aktiváciu aplikácie na pozadí a sťahovanie nového obsahu.

  • Work Manager (Android) ekvivalent pre iOS (nepriame): BGTaskScheduler je ekvivalentom Android Work Manager, ktorý umožňuje plánovať úlohy na pozadí s ohľadom na systémové zdroje a obmedzenia.

Výber konkrétneho mechanizmu závisí od typu úlohy, ktorú je potrebné vykonať na pozadí. Použitie nevhodného mechanizmu môže viesť k zamietnutiu aplikácie pri revízii v App Store a k rýchlemu ukončeniu pozadových procesov systémom. Je tiež dôležité byť opatrný s systémovými zdrojmi: batériou, pamäťou a CPU.