백그라운드 작업과 새로 고침
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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 푸시 알림 등록하기
- 알림 페이로드 처리
- 백그라운드 작업과 새로 고침
- 알림 액션과 카테고리