Sobes.tech
Middle

Jak zajistit pokračování chodu aplikace na pozadí?

sobes.tech AI

Odpověď od AI

Pro zajištění provozu aplikace na pozadí jsou používány různé mechanismy iOS, v závislosti na typu úkolu:

  • Režimy na pozadí (Background Modes): Jedná se o předdefinované systémové režimy, které umožňují provádět určité operace na pozadí. Nejčastější:

    • audio: Přehrávání nebo nahrávání audia.
    • location: Sledování polohy.
    • voip: Práce s VoIP.
    • fetch: Pravidelné stahování nového obsahu.
    • processing: Provádění náročných úkolů.
    • remote-notification: Zpracování push notifikací.

    Pro aktivaci režimů na pozadí je nutné přidat odpovídající klíče do Info.plist nebo využít Capabilities v Xcode.

  • Úkol na pozadí (Background Task): Umožňuje získat omezené období času pro dokončení aktuálního úkolu po přechodu aplikace do režimu na pozadí.

    var backgroundTask: UIBackgroundTaskIdentifier = .invalid
    
    func registerBackgroundTask() {
        backgroundTask = UIApplication.shared.beginBackgroundTask {
            // Zpracování vypršení času
            self.endBackgroundTask()
        }
        // Provádíme úkol na pozadí
        // ...
    }
    
    func endBackgroundTask() {
        UIApplication.shared.endBackgroundTask(backgroundTask)
        backgroundTask = .invalid
    }
    
  • Fetch na pozadí (Background Fetch): Umožňuje systému periodicky spouštět aplikaci na pozadí pro kontrolu a stahování nového obsahu.

    // V AppDelegate, v didFinishLaunchingWithOptions
    UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum)
    
    // V didFinishLaunchingWithOptions nebo v samostatné metodě
    func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        // Provádíme asynchronní načítání dat
        // Po dokončení voláme completionHandler s odpovídajícím výsledkem:
        // .newData, .noData, .failed
        completionHandler(.newData)
    }
    
  • Zpracování na pozadí (Background Processing): Určeno pro provádění náročných úkolů, které mohou trvat dlouhou dobu. Používá se s BGTaskScheduler.

    import BackgroundTasks
    
    let taskID = "com.yourapp.mytask"
    
    func registerBackgroundTasks() {
        BGTaskScheduler.shared.register(forTaskWithIdentifier: taskID) { task in
            // Provádíme úlohu
            self.handleBackgroundTask(task: task as! BGProcessingTask)
        }
    }
    
    func handleBackgroundTask(task: BGProcessingTask) {
        // Provádíme dlouhotrvající úkol
        // Označíme úkol jako dokončený
        task.setTaskCompleted(success: true)
    }
    
    // Plánování úkolu
    func scheduleBackgroundProcessingTask() {
        let request = BGProcessingTaskRequest(identifier: taskID)
        // Nastavení požadavků na prostředí (například dostupnost sítě, nabíjení baterie)
        request.requiresNetworkConnectivity = true
    
        do {
            try BGTaskScheduler.shared.submit(request)
        } catch {
            print("Nelze naplánovat úkol: \(error)")
        }
    }
    
  • Push notifikace: Tiché push notifikace mohou být použity k aktivaci aplikace na pozadí a stahování nového obsahu.

  • Work Manager (Android) ekvivalent pro iOS (nepřímo): BGTaskScheduler je ekvivalentem Android Work Manager, který umožňuje plánovat úkoly na pozadí s ohledem na systémové zdroje a omezení.

Výběr konkrétního mechanismu závisí na typu úkolu, který je třeba provést na pozadí. Použití nevhodného mechanismu může vést k zamítnutí aplikace při revizi v App Store a k rychlému ukončení procesů na pozadí systémem. Je také důležité šetrně zacházet se systémovými zdroji: baterií, pamětí a CPU.