BGTaskScheduler: 개요, iOS의 백그라운드 작업

저자: IT Sectr 게시일: 2026-03-27 읽는 시간: 8 분

BGTaskScheduler는 iOS 13 이상 애플리케이션에서 백그라운드 작업을 예약하고 실행하기 위한 Apple의 프레임워크입니다. 이는 더 이상 사용되지 않는 Background Fetch 및 performFetch를 대체하여 백그라운드 작업을 위한 통합 API를 제공합니다. Apple Developer Documentation, 2026에 따르면 프레임워크에는 두 가지 유형의 작업이 포함됩니다: 장기 작업용 BGProcessingTask와 짧은 콘텐츠 업데이트용 BGAppRefreshTask입니다.

핵심 사항

  • BGTaskScheduler는 이전 Background Fetch를 대체한 백그라운드 작업 관리를 위한 iOS 13+ 프레임워크입니다.
  • BGAppRefreshTask는 콘텐츠 업데이트를 위한 최대 30초의 짧은 백그라운드 작업입니다.
  • BGProcessingTask는 리소스 집약적 작업을 위한 최대 몇 분의 긴 백그라운드 작업입니다.
  • 등록은 Info.plist의 식별자를 통해 및 코드에서 handleTasks를 통해 이루어집니다.
  • 시스템은 사용자 행동에 따라 작업을 시작할 최적의 시간을 자동으로 결정합니다.

BGTaskScheduler란?

BGTaskScheduler는 iOS 13에서 도입된 Apple의 시스템 프레임워크로, 백그라운드 작업 실행을 중앙에서 관리합니다. 도입 이전에는 개발자가 UIApplication backgroundTasks, performFetch 및 appDelegate의 이벤트 처리를 사용하여 코드 조각화와 예측 불가능한 동작을 초래했습니다.

프레임워크는 지연 예약 원칙에 따라 작동합니다: 앱이 고유 식별자로 작업을 등록하면 iOS가 실행할 최적의 시점을 결정합니다. 시스템은 배터리 수준, 사용자 활동, 네트워크 상태 및 기타 요소를 고려합니다.

주요 기능에는 짧은 백그라운드 작업과 긴 백그라운드 작업 모두가 포함됩니다. Android의 AlarmManager와 달리 BGTaskScheduler는 정확한 실행 시간을 보장하지 않습니다 — 시스템은 조건이 불리할 경우 작업을 지연시킬 권리를 보유합니다.

iOS에서 BGTaskScheduler의 작동 방식

BGTaskScheduler는 핸들러 기반 아키텍처를 사용합니다. 앱이 각 작업 유형에 대한 핸들러를 등록하면 시스템이 적절한 시점에 이를 호출합니다. 프레임워크 자체는 작업을 직접 실행하지 않으며 — 실행할 시간이 되었음을 앱에 알릴 뿐입니다.

작업 등록 프로세스

등록은 Info.plist에서 BGTaskSchedulerPermittedIdentifiers 배열을 통해 작업 식별자를 선언하는 것으로 시작됩니다. 그런 다음 앱 코드에서 registerHandler(forTaskWithIdentifier:) 메서드가 핸들러 클로저와 함께 호출됩니다.

swift
import BackgroundTasks

let taskID = "com.example.app.refresh"

BGTaskScheduler.shared.registerHandler(
    forTaskWithIdentifier: taskID,
    using: DispatchQueue.global()
) { task in
    task.expirationHandler = {
        // 강제 종료 시 호출됨
    }
    processBackgroundTask(task as! BGAppRefreshTask)
}

실행 예약

등록 후 앱은 submitTaskRequest를 통해 명시적으로 작업 실행을 요청해야 합니다. 요청에는 작업 식별자와 가능한 가장 빠른 시작 날짜가 포함됩니다. 시스템은 요청을 저장하고 조건이 적합하다고 판단될 때 처리합니다.

swift
let request = BGAppRefreshTaskRequest(
    identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)

do {
    try BGTaskScheduler.shared.submit(request)
} catch {
    print("예약 오류: \(error)")
}

BGTaskScheduler 백그라운드 작업 유형

BGTaskScheduler는 각각 고유한 사용 사례에 맞게 설계된 두 가지 주요 작업 유형을 제공합니다. 올바른 유형을 선택하는 것은 시스템의 작업 실행 성공 확률에 직접적인 영향을 미칩니다.

BGAppRefreshTask

BGAppRefreshTask는 짧은 백그라운드 콘텐츠 업데이트용으로 설계되었습니다: 새 데이터 로드, 서버와 동기화, 위젯 업데이트. 실행 시간은 30초로 제한되며, 이후 시스템이 작업을 강제 종료합니다. 이 유형의 작업은 BGProcessingTask보다 더 자주 실행되며 우선순위가 더 높습니다.

BGProcessingTask

BGProcessingTask는 더 긴 작업용으로 설계되었습니다: 미디어 파일 처리, Core Data 인덱싱, 백업 생성. 작업은 최대 몇 분까지 실행될 수 있지만 시스템은 덜 자주 그리고 유리한 조건(전원 연결, 안정적인 Wi-Fi, 낮은 기기 부하)에서만 실행합니다.

매개변수BGAppRefreshTaskBGProcessingTask
시간 제한30초몇 분
시작 빈도높음낮음
조건모든전원 + Wi-Fi
전원 필요아니요권장
예시피드 업데이트비디오 처리

등록 및 예약

올바른 등록은 BGTaskScheduler가 작동하기 위한 필수 조건입니다. 작업이 Info.plist에 등록되지 않은 경우 시스템은 실행 요청을 무시합니다.

Info.plist에 등록

Info.plist 파일에는 문자열 식별자 목록이 포함된 BGTaskSchedulerPermittedIdentifiers 배열이 포함되어야 합니다. 각 식별자는 앱 내에서 고유해야 합니다. Apple은 역도메인 표기법 사용을 권장합니다.

xml
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
    <string>com.example.app.refresh</string>
    <string>com.example.app.processing</string>
</array>

예약 및 취소

작업을 예약하려면 submitTaskRequest 메서드를 사용합니다. 작업이 더 이상 필요하지 않은 경우 cancelTaskRequest 또는 cancelAllTaskRequests를 통해 취소할 수 있습니다. 시스템은 앱이 삭제되거나 데이터가 재설정될 때도 자동으로 작업을 취소합니다.

작업 상태 모니터링

BGTaskScheduler는 getPendingTaskRequests를 통해 예약된 작업의 상태를 추적하는 기능을 제공합니다. 이 메서드는 유형, 식별자 및 earliestBeginDate에 대한 정보와 함께 모든 활성 요청 목록을 반환합니다. 각 요청에 대해 이미 완료 또는 취소되었는지 확인하고 재예약 여부를 결정할 수 있습니다.

시스템이 백그라운드 작업의 성공에 대한 직접적인 콜백을 제공하지 않는다는 점에 유의해야 합니다 — 핸들러 자체가 작업 속성을 통해 결과를 보고해야 합니다. setTaskCompleted를 사용하면 작업을 성공적으로 완료된 것으로 표시할 수 있으며, 이후 시스템이 이 유형의 다음 예약된 작업을 시작할 수 있습니다. 작업이 setTaskCompleted를 호출하지 않으면 시스템은 시간 초과 또는 강제 종료 시 완료된 것으로 간주합니다.

진단을 위해 핸들러에서 OSLog를 사용하고 Mac의 Console.app을 통해 로그를 확인하는 것이 좋습니다. Apple은 백그라운드 작업 성능 분석을 위한 MetricKit 도구도 제공합니다 — 실행 시간, 에너지 소비 및 시작 빈도에 대한 데이터를 수집하여 최적화에 사용할 수 있습니다.

swift
// 특정 작업 취소
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)

// 모든 작업 취소
BGTaskScheduler.shared.cancelAllTaskRequests()

// 예약된 작업 확인
BGTaskScheduler.shared.getPendingTaskRequests { requests in
    print("\(requests.count)개 작업 예약됨")
}

제한 사항 및 권장 사항

BGTaskScheduler는 백그라운드 작업에 엄격한 제한을 부과합니다. 시스템은 조건이 불리할 경우 작업을 무기한 지연시킬 수 있습니다. 개발자는 프레임워크가 실시간 작업용이 아님을 이해해야 합니다.

주요 제한 사항은 다음과 같습니다: 시스템은 지정된 시간에 작업 실행을 보장하지 않으며, 동시 작업 최대 수가 제한되고, 에너지 소비가 엄격히 제어됩니다. 여러 작업을 연속으로 실행하면 병합되거나 취소될 수 있습니다.

실행 가능성을 높이려면 BGProcessingTask의 경우 1시간 이상, BGAppRefreshTask의 경우 15분 이상의 earliestBeginDate를 설정하는 것이 좋습니다. expirationHandler를 처리하는 것도 중요합니다 — 작업이 시간 제한을 맞출 수 없는 경우 시스템이 이 핸들러를 호출하여 적절히 종료합니다. 지속적인 백그라운드 작업 주기를 유지하기 위해 핸들러 자체 내에서 재예약을 수행해야 합니다.

또 다른 중요한 제한 사항은 네트워크 요청과 관련됩니다. BGTaskScheduler는 작업 실행 중 활성 네트워크 연결을 보장하지 않습니다. 앱은 NWPathMonitor를 통해 독립적으로 네트워크 가용성을 확인하고 연결이 없으면 처리를 연기해야 합니다. 이는 특정 유형의 네트워크에 연결된 경우에만 작업을 활성화할 수 있는 Android JobScheduler와 다릅니다. 실제로 개발자는 안정적인 데이터 로딩을 위해 BGTaskScheduler를 NSURLSession의 백그라운드 URL 세션과 결합하는 경우가 많습니다.

macOS 및 watchOS 호환성

macOS Catalina부터 BGTaskScheduler는 Mac에서도 사용할 수 있습니다. 이를 통해 Apple Silicon에서 실행되는 UIKit 앱용 교차 플랫폼 백그라운드 작업을 만들 수 있습니다. watchOS에서는 프레임워크 기능이 제한적입니다 — 컴플리케이션 업데이트 및 iPhone과의 데이터 동기화를 위한 짧은 BGAppRefreshTask만 사용할 수 있습니다. 개발자는 백그라운드 아키텍처를 계획할 때 플랫폼 차이를 고려해야 합니다.

디버깅 및 진단 도구

Apple은 BGTaskScheduler 디버깅을 위한 여러 도구를 제공합니다. lldb의 명령 e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"]는 시스템 제한을 우회하여 백그라운드 작업을 강제로 시작합니다. Xcode의 Debug 메뉴에는 짧은 백그라운드 업데이트를 에뮬레이트하는 Simulate Background Fetch 플래그가 있습니다. 성능 분석에는 MetricKit이 사용됩니다 — 각 작업의 시작 빈도, 실행 시간 및 에너지 소비에 대한 정보를 수집합니다. 이 데이터는 예약 빈도를 최적화하고 올바른 작업 유형을 선택하는 데 도움이 됩니다.

실제로 BGTaskScheduler는 위젯 데이터 업데이트, iCloud 동기화, 콘텐츠가 포함된 푸시 알림 처리 및 Spotlight 검색 인덱싱에 적합합니다. 실시간 분석, 채팅 애플리케이션 또는 즉시 실행이 필요한 작업에는 적합하지 않습니다.

Apple 리소스 및 문서

BGTaskScheduler에 대한 심층 학습을 위해 Apple은 공식 WWDC 문서를 권장합니다: "Advances in Background Tasks" 세션(2020)은 더 이상 사용되지 않는 API에서의 마이그레이션을 다루고, "Background Tasks in Practice"(2021)에는 실제 사용 사례가 포함되어 있습니다. Energy Efficiency Guide 섹션도 유용하며, 프레임워크가 Apple의 전체 에너지 절약 전략에 어떻게 부합하는지 설명합니다. 코드 예제는 GitHub의 공식 Apple Developer 저장소에서 iOS 및 macOS용 전체 프로젝트와 함께 제공됩니다.

자주 묻는 질문

BGTaskScheduler는 iOS 12의 Background Fetch와 어떻게 다른가요?

Background Fetch는 앱당 하나의 백그라운드 작업으로 제한되었고 우선순위 메커니즘이 없었습니다. BGTaskScheduler는 다양한 유형의 여러 작업을 지원하며 통합 API와 자동 에너지 관리를 제공합니다.

BGTaskScheduler에 몇 개의 백그라운드 작업을 등록할 수 있나요?

Apple은 등록된 식별자 수에 명시적 제한을 두지 않지만 실제로는 5~10개 이하의 작업을 사용하는 것이 좋습니다. 더 많은 수는 시스템 리소스 경쟁으로 인해 각 특정 작업이 실행될 확률을 낮춥니다.

실제 기기에서 BGTaskScheduler 실행을 디버깅하려면 어떻게 하나요?

디버깅하려면 lldb에서 명령 e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"]를 사용합니다. 시스템 제한을 우회하여 작업을 강제로 시작합니다. Debug 메뉴의 Xcode Simulate Background Fetch 플래그도 사용할 수 있습니다.

앱이 종료된 경우에도 BGTaskScheduler가 작업을 실행할 수 있나요?

네, BGTaskScheduler는 사용자가 앱을 강제 종료한 경우에도 프로세스를 시작할 수 있습니다. 그러나 시스템이 추가 지연을 적용할 수 있으며 모든 작업 유형이 이 시나리오에서 실행을 보장하지는 않습니다.

작업이 할당된 시간 내에 완료되지 않으면 어떻게 되나요?

시스템이 expirationHandler를 호출하여 작업에 종료가 필요함을 알립니다. 앱이 이 신호를 무시하고 계속 작동하면 iOS가 프로세스를 강제 종료합니다. 이후 시스템은 앱의 모든 백그라운드 작업 우선순위를 낮출 수 있습니다.

요약

  • BGTaskScheduler는 iOS 13+ 및 macOS Catalina+에서 모든 백그라운드 작업을 관리하기 위한 Apple의 통합 프레임워크입니다.
  • 두 가지 작업 유형 — 최대 30초의 BGAppRefreshTask와 최대 몇 분의 BGProcessingTask — 다양한 백그라운드 작업 시나리오를 다룹니다.
  • 등록은 Info.plist(식별자)와 코드(registerHandler) 두 곳에서 필요합니다.
  • 예약은 earliestBeginDate와 함께 submitTaskRequest를 통해 — 시스템이 최적의 시작 시점을 선택합니다.
  • ExpirationHandler는 시스템에 의한 작업 강제 종료 처리를 위해 필수입니다.
  • 제한 사항에는 실행 보장 없음, 에너지 소비 제어 및 기기 상태에 대한 의존성이 포함됩니다.
  • 사용 BGTaskScheduler는 콘텐츠 업데이트, 동기화 및 인덱싱에 사용하지만 실시간 작업에는 사용하지 마십시오.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기