0Pricing
Swift Academy · 강의

백그라운드 작업과 새로 고침

BGTaskScheduler로 백그라운드 작업을 예약합니다.

백그라운드 작업과 새로 고침은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

백그라운드 작업이 존재하는 이유

iOS는 배터리를 절약하기 위해 앱을 적극적으로 일시 중단합니다. 백그라운드에서 피드를 새로 고치거나 다운로드를 처리하는 등 의미 있는 작업을 하려면 BGTaskScheduler를 통해 예약합니다. 시스템은 전원과 사용 패턴을 고려해 요구 사항과 균형을 맞추면서 작업을 실행할 시점을 결정합니다.

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

두 가지 작업 유형

작업에는 두 가지 유형이 있습니다. BGAppRefreshTask는 몇 초 정도 걸리는 짧고 빈번한 업데이트에 사용하고, BGProcessingTask는 데이터베이스 유지 관리처럼 몇 분이 걸리는 더 길고 무거운 작업에 사용하며 전원이나 네트워크가 필요하도록 설정할 수도 있습니다.

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

식별자 선언

각 작업에는 고유한 식별자가 필요하며, 이 식별자를 Info.plist의 BGTaskSchedulerPermittedIdentifiers 아래에 나열합니다. 이 선언이 없으면 등록이 실패합니다. 역 DNS 형식의 문자열을 사용하세요.

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

처리기 등록

앱이 시작될 때 각 식별자에 대한 처리기를 BGTaskScheduler.shared.register로 등록합니다. 이 작업은 앱 시작이 완료되기 전에 이루어져야 합니다. 이후 시스템이 작업을 실행하기로 결정할 때마다 처리기가 실행됩니다.

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

요청 제출

등록은 처리기를 연결할 뿐입니다. 실제 실행을 요청하려면 BGAppRefreshTaskRequest를 만들고 가장 이른 시작 날짜를 설정한 다음 submit합니다. 시스템은 이 날짜를 보장된 시점이 아니라 힌트로 취급합니다.

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

항상 다시 예약하기

제출한 요청은 최대 한 번만 실행됩니다. 계속 새로 고치려면 처리기가 완료되기 전에 다음 요청을 제출해야 합니다. 먼저 다시 예약한 후 작업을 수행하세요. 그러면 작업 중간에 앱이 중단되어도 주기가 멈추지 않습니다.

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

완료 알리기

작업이 끝나면 task.setTaskCompleted(success:)를 호출해야 합니다. 이를 잊으면 백그라운드 리소스를 낭비하고 이후 작업의 우선순위가 낮아질 수 있습니다. 작업의 성공 여부를 전달하면 시스템이 이후 예약을 조정할 수 있습니다.

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

만료 처리기 준수

시스템은 할당된 시간을 일찍 회수할 수 있습니다. task.expirationHandler를 설정해 진행 중인 작업을 취소하고 정리하면 시간이 다 되었을 때 정상적으로 종료할 수 있습니다. 이를 마감 알람처럼 생각하세요.

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 }

요구 사항이 있는 처리 작업

무거운 작업에는 BGProcessingTaskRequest를 사용해 requiresNetworkConnectivity와 requiresExternalPower를 설정할 수 있습니다. 시스템은 이러한 조건이 충족될 때까지 기다리므로, 긴 작업을 기기가 밤새 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)
}

디버거에서 테스트하기

시스템이 예약할 때까지 몇 시간을 기다릴 필요는 없습니다. 디버거에서 실행을 일시 중지한 다음 LLDB 명령을 실행해 등록된 작업을 즉시 시작하면 처리기를 처음부터 끝까지 확인할 수 있습니다.

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

완전한 새로 고침 주기

전체 흐름을 살펴보면 다음과 같습니다. 앱 시작 시 등록하고, 백그라운드에서 제출하며, 처리기에서 다시 예약하고 만료 처리기로 보호한 뒤 비동기 작업을 수행하고 완료를 보고합니다.

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 }

빠른 확인

반복되는 새로 고침 작업의 생명 주기를 떠올려 보세요.

요약

백그라운드 예약을 학습하셨습니다:

  • BGAppRefreshTask는 짧은 새로 고침에, BGProcessingTask는 전원 및 네트워크 요구 사항이 있는 장시간 유지 관리에 사용합니다.
  • Info.plist에 식별자를 선언하고, 앱 시작 시 처리기를 register하며, earliestBeginDate가 포함된 요청을 submit합니다.
  • 처리기 내부에서 다음 실행을 다시 예약하고 expirationHandler를 설정하며 항상 setTaskCompleted를 호출합니다.
  • 테스트하려면 LLDB를 통해 작업을 강제로 시작합니다.

자주 묻는 질문

“백그라운드 작업과 새로 고침” 강의는 무료인가요?

네 — “백그라운드 작업과 새로 고침” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“백그라운드 작업과 새로 고침”에서 뭘 배우나요?

BGTaskScheduler로 백그라운드 작업을 예약합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“백그라운드 작업과 새로 고침” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 푸시 알림 등록하기
  2. 알림 페이로드 처리
  3. 백그라운드 작업과 새로 고침
  4. 알림 액션과 카테고리
← Swift Academy(으)로 돌아가기