Background Task: nyckelbegrepp, registrering av uppgifter och utförande i bakgrunden

Författare: IT Sectr Publicerad: 2026-03-27 Lästid: 10 min

Background Task — iOS-mekanismen som gör att appen kan slutföra en påbörjad operation efter övergång till bakgrundsläge. Systemet tilldelar begränsad tid (upp till 30 sekunder) för att utföra uppgiften, varefter appen tvångspausas. Enligt Apple, 2026 är användning av expiration handler ett obligatoriskt krav för korrekt slutförande av en bakgrundsuppgift.

Huvudpunkter

  • Background Task — iOS-mekanism för att slutföra operationer efter att appen går till bakgrunden.
  • beginBackgroundTask — nyckelmetoden i UIApplication för att registrera en bakgrundsuppgift.
  • Expiration handler — kodblock som anropas av systemet när den tilldelade tiden har löpt ut.
  • Begränsning på 30 sekunder — standardtid för utförande, förlängning via Background Modes.
  • UIApplication.shared.endBackgroundTask — obligatoriskt anrop för korrekt slutförande av uppgiften.

Vad är Background Task i iOS?

Background Task är en programvarumekanism i iOS som gör att appen kan förlänga utförandetiden efter övergång till bakgrundsläge. När användaren minimerar appen anropar systemet UIApplicationDelegate.applicationDidEnterBackground. Om en kritisk operation (spara data, skicka begäran) utförs vid den tidpunkten kan appen begära extra tid via beginBackgroundTask.

Varför behövs Background Tasks

Utan användning av Background Task tvångspausas appen 3–5 sekunder efter att den går till bakgrunden. Alla ofullbordade operationer avbryts: data sparas inte, nätverksförfrågningar bryts, tillstånd går förlorade. Background Task ger appen upp till 30 sekunder att korrekt slutföra dessa operationer.

  • Spara tillstånd — skriva data till CoreData, UserDefaults eller filsystemet.
  • Slutföra nätverksförfrågningar — vänta på svar från servern och bearbeta resultatet.
  • Skicka analys — överföra händelser till analysservern före paus.
  • Rensa resurser — stänga filbeskrivare, frigöra minne.
  • Cachning — skriva mellanresultat för återställning vid nästa start.

Historia och utveckling

beginBackgroundTask dök upp i iOS 4.0 — den första versionen som stödde multitasking. Före iOS 4 stängdes appen helt när hemknappen trycktes. Från och med iOS 7 kom Background Fetch och URLSession background configuration. Från och med iOS 13 rekommenderar Apple BGTaskScheduler för nya projekt, men beginBackgroundTask är fortfarande relevant för kortsiktiga operationer.

Hur fungerar beginBackgroundTask: livscykel

beginBackgroundTask — en metod i UIApplication som registrerar en uppgift och returnerar en unik identifierare UIBackgroundTaskIdentifier. Systemet förlänger timern för bakgrundsexekvering. När tiden har löpt ut anropas expiration handler, varefter appen måste anropa endBackgroundTask(identifier:) för korrekt slutförande.

Steg-för-steg-process

Steg 1 — appen får meddelandet didEnterBackground. Steg 2 — beginBackgroundTask(expirationHandler:) anropas. Steg 3 — den kritiska operationen (spara, nätverksförfrågan) utförs. Steg 4 — vid slutförande anropas endBackgroundTask(identifier:). Om operationen inte slutförs inom 30 sekunder — anropar systemet expiration handler och appen måste omedelbart avsluta uppgiften.

swift
var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid

func startBackgroundTask() {
    backgroundTaskID = UIApplication.shared.beginBackgroundTask {
        // Expiration handler
        UIApplication.shared.endBackgroundTask(backgroundTaskID)
        backgroundTaskID = .invalid
    }
}

func finishBackgroundTask() {
    UIApplication.shared.endBackgroundTask(backgroundTaskID)
    backgroundTaskID = .invalid
}

UIApplication.shared.backgroundTimeRemaining

Egenskapen backgroundTimeRemaining returnerar antalet sekunder som återstår till tvångsavslutning av bakgrundsuppgiften. Värdet minskar i realtid. Om appen inte är i bakgrunden — returnerar DBL_MAX. Använd denna egenskap för att anpassa beteendet: när mindre än 5 sekunder återstår, avbryt långa operationer och spara förloppet.

Flera uppgifter

Appen kan registrera flera Background Tasks samtidigt. Varje uppgift får sin egen identifierare. Den totala utförandetiden summeras — om 3 uppgifter är registrerade kan appen få upp till 90 sekunder. Systemet kan dock avsluta appen tidigare om resurserna är uttömda eller batterigränsen har överskridits.

Expiration handler: obligatorisk hantering av slutförande

Expiration handler är ett kodblock som anropas av systemet när den tilldelade tiden för bakgrundsuppgiften har löpt ut. Närvaron av en expiration handler är ett obligatoriskt krav från Apple. Utan den kan appen tvångsavslutas av systemet och data kan gå förlorade.

Vad ska finnas i expiration handler

Expiration handler ska utföra minimala åtgärder för att spara appens tillstånd: spara aktuella data i beständig lagring, anropa endBackgroundTask med motsvarande identifierare och ställa in identifieraren på .invalid. Inuti expiration handler är det förbjudet att starta nya långa operationer — utförandetiden är begränsad till 1–2 sekunder.

swift
func handleExpiration() {
    // Sparar utförandeförlopp
    saveProgressToUserDefaults()

    // Avbryter aktiva nätverksförfrågningar
    currentTask?.cancel()

    // Avslutar Background Task
    UIApplication.shared.endBackgroundTask(backgroundTaskID)
    backgroundTaskID = .invalid
}

// Registrering med expiration handler
backgroundTaskID = UIApplication.shared.beginBackgroundTask(
    withName: "SaveDocument",
    expirationHandler: handleExpiration
)

Fel vid arbete med expiration handler

Det vanligaste felet är att inte anropa endBackgroundTask inuti expiration handler. I detta fall fortsätter systemet att betrakta uppgiften som aktiv, appen går inte till Suspended-tillstånd och batteriet laddas ur. Det andra felet är att starta långa operationer inuti expiration handler. Systemet kan avsluta appen innan de är klara och data går förlorade.

Kontroll av återstående tid

I expiration handler är utförandetiden kritiskt kort — vanligtvis mindre än 1 sekund. Därför kan man inte utföra inuti handlern: komplexa beräkningar, nätverksförfrågningar, skriva stora mängder data till CoreData. Endast atomära operationer: skriva en nyckel i UserDefaults, ställa in en statusflagga, anropa endBackgroundTask.

Kodexempel för Background Task i Swift

Låt oss titta på en fullständig implementering av Background Task för att spara ett dokument när appen går till bakgrunden. Exemplet omfattar uppgiftsregistrering, utförande av operationen med kontroll av återstående tid och korrekt slutförande via endBackgroundTask.

Spara dokument med förlopp

Vid övergång till bakgrunden initierar appen sparandet av ett stort dokument. Background Task ger upp till 30 sekunder för operationen. Om tiden löper ut — sparar expiration handler mellanresultaten. Efter att sparandet är klart anropas endBackgroundTask för att frigöra resurser.

swift
class DocumentManager {
    private var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid

    func saveDocumentInBackground(document: Document) {
        backgroundTaskID = UIApplication.shared.beginBackgroundTask {
            self.saveProgress(document)
            self.endBackgroundTask()
        }

        DispatchQueue.global().async {
            document.save()
            self.endBackgroundTask()
        }
    }

    private func endBackgroundTask() {
        UIApplication.shared.endBackgroundTask(backgroundTaskID)
        backgroundTaskID = .invalid
    }
}

Skicka data till servern

Nätverksförfrågningar i bakgrunden kräver särskild uppmärksamhet — expiration handler kan avbryta förfrågan innan svar tas emot. Använd URLSession med dataTask och kontrollera backgroundTimeRemaining före sändning. Om mindre än 5 sekunder återstår — skjut upp sändningen till nästa gång appen aktiveras.

swift
func sendCriticalData(data: Data) {
    backgroundTaskID = UIApplication.shared.beginBackgroundTask {
        // Sparar data för återsändning
        saveForRetry(data)
        self.endBackgroundTask()
    }

    let task = URLSession.shared.dataTask(with: request) { _, _, error in
        if error != nil {
            saveForRetry(data)
        }
        self.endBackgroundTask()
    }
    task.resume()
}

Övervakning av återstående tid

För långa operationer, övervaka UIApplication.shared.backgroundTimeRemaining. Om värdet sjunker under tröskeln (10 sekunder), avbryt den aktuella operationen och starta sparandet av mellanresultat. Detta möjliggör korrekt slutförande av arbetet före tvångsanropet av expiration handler.

Bästa praxis för användning av Background Task

Background Task är en kraftfull mekanism, men felaktig användning leder till problem med batteri och prestanda. Att följa Apples rekommendationer och beprövad praxis från communityn hjälper till att undvika typiska misstag och säkerställa stabil drift av appen.

Minimera utförandetiden

Slutför Background Task så snabbt som möjligt. Varje sekund av bakgrundsexekvering förbrukar batterienergi. Optimal tid — mindre än 5 sekunder. Om operationen tar längre tid — överväg att använda BGTaskScheduler eller Background Modes. Förläng inte uppgiften på konstgjord väg via beginBackgroundTask-anrop utan verkligt behov.

Korrekt användning av identifierare

Lagra UIBackgroundTaskIdentifier som en egenskap hos en klass eller struktur. Skicka den aldrig som en global variabel — detta leder till konflikter vid flera uppgifter. Ställ in identifieraren på .invalid efter anrop av endBackgroundTask för att förhindra dubbelt slutförande.

Testa Background Task

I Xcode Simulator, växla appen till bakgrunden via hemknappen (Command + Shift + H). Använd Debug — Simulate Background Fetch för att testa bakgrundsaktivering. För att simulera tidsutgång, ställ in miljövariabeln BACKGROUND_TASK_SIMULATE_EXPIRATION = YES — expiration handler anropas efter 5 sekunder.

swift
// Kontroll av återstående tid före operationens start
let remaining = UIApplication.shared.backgroundTimeRemaining
guard remaining > 10.0 else {
    // Otillräcklig tid — skjut upp uppgiften
    scheduleForNextLaunch()
    return
}

// Utförande av operation med tidskontroll
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
    saveProgress()
    self.endBackgroundTask()
}

Undvik retain cycles

Expiration handler fångar self — detta kan skapa en retain cycle om backgroundTaskID lagras som en egenskap hos samma objekt. Använd [weak self] i closuren eller lagra identifieraren separat. En retain cycle leder till minnesläckor — objektet frigörs inte förrän appen avslutas.

Background Task vs BGTaskScheduler: jämförelse av metoder

Med lanseringen av iOS 13 introducerade Apple BGTaskScheduler — en modern ersättning för det gamla Background Task API. Båda mekanismerna löser liknande uppgifter, men BGTaskScheduler ger mer kontroll och flexibilitet. Att förstå skillnaderna hjälper till att välja rätt verktyg för ett specifikt scenario.

EgenskapBackground TaskBGTaskScheduler
iOS-version4.0+13.0+
Max. tid30 sekunder30 s / 10 min (processing)
InitieringdidEnterBackgroundSchemaläggning + system
Garanti för utförandeEndast vid övergång till bakgrundenNär som helst som passar systemet
Expiration handlerJa, obligatoriskJa, via task.expirationHandler
InternetKrävs vid startTillgänglig via requiresNetworkConnectivity
LaddningKrävs inteValfritt för processing

När ska man använda Background Task

beginBackgroundTask är lämplig för kortsiktiga operationer som måste utföras omedelbart vid övergång till bakgrunden: spara tillstånd, slutföra nätverksförfrågan, cacha data. API:et är enkelt och kräver ingen konfiguration av Info.plist eller registrering av identifierare. Idealisk för operationer som varar mindre än 10 sekunder.

När ska man använda BGTaskScheduler

BGTaskScheduler är lämplig för uppgifter som kan utföras när som helst: periodisk synkronisering, rensning av cache, uppdatering av widgets. Systemet väljer själv den optimala tiden med hänsyn till användarens beteende och batteristatus. För långa operationer (upp till 10 minuter) använd BGProcessingTask.

Gemensam användning

Båda API:en kan användas i en app. Background Task — för omedelbara operationer vid övergång till bakgrunden (spara utkast). BGTaskScheduler — för schemalagda uppdateringar (synkronisering var 6:e timme). Uppdelning av ansvar möjliggör korrekt datalagring och energieffektiv bakgrundstjänst.

Vanliga frågor

Kan man anropa beginBackgroundTask utanför didEnterBackground?

Ja, beginBackgroundTask kan anropas när som helst under appens drift. Systemets tidsallokering börjar dock först efter övergång till bakgrunden. Om appen är i förgrunden har anropet av beginBackgroundTask ingen effekt — backgroundTimeRemaining returnerar DBL_MAX och uppgiften aktiveras när appen går till bakgrunden.

Vad händer om endBackgroundTask inte anropas?

Om endBackgroundTask inte anropas fortsätter systemet att betrakta appen som aktiv i bakgrunden. Efter 30 sekunder anropas expiration handler, men om inte heller den innehåller endBackgroundTask — stannar appen kvar i minnet och förbrukar batteri. I iOS 13+ tvångsavslutar systemet en sådan app efter 3 minuter.

Hur förlänger man Background Task-tiden över 30 sekunder?

Standardtiden är 30 sekunder. Förlängning är endast möjlig via Background Modes: Audio (uppspelning), Location (geolokalisering), Bluetooth (BLE). Eller via BGProcessingTask (iOS 13+) — upp till 10 minuter vid laddning och Wi-Fi. beginBackgroundTask i sig själv erbjuder inget sätt att öka gränsen.

Fungerar Background Task på iPad?

Ja, iPadOS stöder fullt ut beginBackgroundTask med samma begränsningar som iOS. På iPad med Stage Manager kan appen stanna kvar i minnet längre — systemet pausar appar mer sällan på grund av större mängd RAM. Men gränsen på 30 sekunder för bakgrundsuppgiften kvarstår.

Hur felsöker man Background Task på en verklig enhet?

Anslut enheten till Xcode, starta appen, minimera den — i konsolen visas systemloggar. Använd sysdiagnose för att samla in detaljerade loggar: framtvinga sysdiagnose från enheten (Volume Up + Down + Power). I Xcode Debug Navigator övervakar du aktiviteten hos bakgrundsuppgifter.

Sammanfattning

  • Background Task — iOS-mekanism för att slutföra operationer efter övergång till bakgrunden, tillgänglig sedan iOS 4.0.
  • beginBackgroundTask — metod i UIApplication som registrerar uppgiften och returnerar en identifierare för dess slutförande.
  • Expiration handler — obligatoriskt kodblock som anropas av systemet när 30-sekundersgränsen löper ut.
  • endBackgroundTask — obligatoriskt anrop för korrekt slutförande av uppgiften; utan den stannar appen kvar i minnet.
  • BGTaskScheduler — modernt alternativ (iOS 13+) med schemaläggning, två uppgiftstyper och utförandevillkor.
  • backgroundTimeRemaining — egenskap för att kontrollera återstående tid och anpassa uppgiftens beteende.
  • Använd Background Task för omedelbara kortsiktiga operationer och BGTaskScheduler för schemalagda bakgrundsuppdateringar i nya projekt.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också