0Pricing
Swift Academy · Lezione

Attività e aggiornamento in background

Pianifichi il lavoro in background con BGTaskScheduler.

Attività e aggiornamento in background è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.

Perché esistono le attività in background

iOS sospende in modo aggressivo le app per risparmiare batteria. Per eseguire operazioni significative mentre l'app è in background — aggiornare un feed o elaborare un download — le pianifichi tramite BGTaskScheduler. Il sistema decide quando eseguirle, bilanciando le Sue esigenze con il consumo energetico e le modalità d'uso.

import BackgroundTasks
// You request work; the system schedules it later
// at an opportune moment (charging, on Wi-Fi, etc.)

Due tipi di attività

Esistono due tipi: BGAppRefreshTask per aggiornamenti brevi e frequenti (della durata di pochi secondi) e BGProcessingTask per operazioni più lunghe e impegnative (della durata di minuti), come la manutenzione del database, che possono richiedere alimentazione o rete.

import BackgroundTasks
// BGAppRefreshTask  -> quick content refresh
// BGProcessingTask  -> long maintenance, can require
//                      external power / network

Dichiarazione degli identificatori

Ogni attività richiede un identificatore univoco, che deve essere elencato in Info.plist sotto BGTaskSchedulerPermittedIdentifiers. Senza questa dichiarazione, la registrazione non riesce. Utilizzi stringhe in stile reverse DNS.

// Info.plist:
// BGTaskSchedulerPermittedIdentifiers = [
//   "com.example.app.refresh",
//   "com.example.app.cleanup"
// ]
let ids = "declare every identifier in Info.plist"
_ = ids

Registrazione di un gestore

All'avvio, registri un gestore per ogni identificatore con BGTaskScheduler.shared.register. Questa operazione deve avvenire prima che l'avvio dell'app sia completato. Il gestore viene eseguito ogni volta che il sistema decide in seguito di eseguire l'attività.

import BackgroundTasks
func registerTasks() {
    BGTaskScheduler.shared.register(
        forTaskWithIdentifier: "com.example.app.refresh",
        using: nil) { task in
        handleRefresh(task as! BGAppRefreshTask)
    }
}

Invio di una richiesta

La registrazione configura soltanto il gestore. Per chiedere effettivamente un'esecuzione, crei un oggetto BGAppRefreshTaskRequest, imposti la data di inizio più vicina e lo invii con submit. Il sistema considera la data un suggerimento, non una garanzia.

import BackgroundTasks
func scheduleRefresh() {
    let request = BGAppRefreshTaskRequest(
        identifier: "com.example.app.refresh")
    request.earliestBeginDate = Date(
        timeIntervalSinceNow: 15 * 60)
    try? BGTaskScheduler.shared.submit(request)
}

Pianificare sempre nuovamente

Una richiesta inviata viene eseguita al massimo una volta. Per continuare ad aggiornare i dati, il gestore deve inviare la richiesta successiva prima di terminare. Pianifichi prima la richiesta successiva e svolga poi il lavoro, così un arresto durante l'elaborazione non interrompe il ciclo.

import BackgroundTasks
func handleRefresh(_ task: BGAppRefreshTask) {
    scheduleRefresh() // queue the next run first
    // ... then perform this run's work
}

Segnalare il completamento

Al termine deve chiamare task.setTaskCompleted(success:). Dimenticarsene spreca il tempo disponibile in background e può far diminuire la priorità delle attività future. Indichi se l'operazione è riuscita, così il sistema può adattare la pianificazione.

import BackgroundTasks
func handleRefresh(_ task: BGAppRefreshTask) {
    scheduleRefresh()
    Task {
        let ok = await fetchLatest()
        task.setTaskCompleted(success: ok)
    }
}
func fetchLatest() async -> Bool { true }

Rispettare il gestore di scadenza

Il sistema può recuperare in anticipo il tempo assegnato. Imposti task.expirationHandler per annullare le operazioni in corso e ripulire le risorse, in modo da terminare correttamente se l'esecuzione viene interrotta. Lo consideri come un allarme che segnala una scadenza.

import BackgroundTasks
func handle(_ task: BGAppRefreshTask) {
    let work = Task { await fetchLatest() }
    task.expirationHandler = {
        work.cancel() // stop before the OS suspends us
    }
}
func fetchLatest() async -> Bool { true }

Elaborazione delle attività con requisiti

Per le operazioni pesanti, BGProcessingTaskRequest consente di impostare requiresNetworkConnectivity e requiresExternalPower. Il sistema attende che queste condizioni siano soddisfatte, così le attività lunghe possono essere eseguite mentre il dispositivo si ricarica durante la notte connesso al Wi-Fi.

import BackgroundTasks
func scheduleCleanup() {
    let req = BGProcessingTaskRequest(
        identifier: "com.example.app.cleanup")
    req.requiresExternalPower = true
    req.requiresNetworkConnectivity = false
    try? BGTaskScheduler.shared.submit(req)
}

Test nel debugger

Non dovrà aspettare ore perché il sistema pianifichi l'esecuzione. Metta in pausa l'app nel debugger ed esegua un comando LLDB per forzare l'avvio immediato di un'attività registrata, così potrà verificare il gestore dall'inizio alla fine.

// In LLDB while paused:
// e -l objc -- (void)[[BGTaskScheduler sharedScheduler]
//   _simulateLaunchForTaskWithIdentifier:
//   @"com.example.app.refresh"]
let test = "force-launch task via LLDB"
_ = test

Un ciclo completo di aggiornamento

Riassumendo: registri il gestore all'avvio, invii la richiesta quando l'app passa in background e, nel gestore, pianifichi nuovamente l'attività, la protegga con un gestore di scadenza, esegua il lavoro asincrono e segnali il completamento.

import BackgroundTasks
func handleRefresh(_ task: BGAppRefreshTask) {
    scheduleRefresh()
    let work = Task { await fetchLatest() }
    task.expirationHandler = { work.cancel() }
    Task {
        let ok = await work.value
        task.setTaskCompleted(success: ok)
    }
}
func fetchLatest() async -> Bool { true }

Verifica rapida

Ricordi il ciclo di vita di un'attività di aggiornamento ricorrente.

Riepilogo

Ha imparato a pianificare le attività in background:

  • BGAppRefreshTask per aggiornamenti brevi e BGProcessingTask per attività di manutenzione lunghe con requisiti di alimentazione o rete.
  • Dichiari gli identificatori in Info.plist, registri i gestori all'avvio con register e invii le richieste con submit, impostando un earliestBeginDate.
  • Pianifichi l'esecuzione successiva all'interno del gestore, imposti un expirationHandler e chiami sempre setTaskCompleted.
  • Forzi l'avvio delle attività tramite LLDB per eseguire i test.

Domande Frequenti

La lezione «Attività e aggiornamento in background» è gratuita?

Sì — il testo completo di «Attività e aggiornamento in background» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.

Cosa imparerò in «Attività e aggiornamento in background»?

Pianifichi il lavoro in background con BGTaskScheduler. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Attività e aggiornamento in background»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Registrazione alle notifiche push
  2. Gestione dei payload delle notifiche
  3. Attività e aggiornamento in background
  4. Azioni e categorie delle notifiche
← Torna a Swift Academy