Background Modes는 앱이 백그라운드로 전환된 후에도 코드 실행을 계속할 수 있도록 하는 iOS의 선언 가능한 기능 집합입니다. 각 모드는 특정 작업 유형과 일치합니다: 오디오, 지역 정보, VoIP, Bluetooth, fetch 그리고 processing입니다. Apple, 2026에 따르면, Background Modes의 부적절한 사용은 App Store 리뷰에서 앱이 거절되는 흔한 원인 중 하나입니다.
주요 포인트
Background Modes는 백그라운드에서 특정 유형의 작업을 수행하겠다는 앱의 의도를 선언하는 Xcode 프로젝트 기능입니다. 백그라운드에서 임의의 Service를 시작할 수 있는 Android와 달리, iOS는 Info.plist에서 모드를 명시적으로 선언해야 합니다. 각 모드에는 엄격한 사용 규칙이 있으며 Apple이 리뷰 중에 검사합니다.
앱이 백그라운드로 전환되면, iOS는 3–5초 내에 앱을 일시 중단합니다. 앱이 Background Mode를 선언하고 해당 API(예: 오디오의 경우 AVAudioSession)를 활성적으로 사용하면, 시스템은 앱을 특별 실행 모드로 넣습니다. 앱은 메모리에 그대로 남아 있으며 모드 유형에 의해 제한된 코드를 실행할 수 있습니다.
iOS는 다음과 같은 Background Modes를 지원합니다: Audio, Location, VoIP, Bluetooth LE (BLE 액세서리), Background Fetch (정기 업데이트), Background Processing (장기 작업), External Accessory Communication, Push to Talk (PTT) 그리고 HealthKit. 각 모드는 앱 설명에서 정당화가 필요합니다.
| 모드 | Info.plist 키 | 목적 | iOS 버전 |
|---|---|---|---|
| Audio | audio | 백그라운드 오디오, AirPlay | 4.0+ |
| Location | location | 위치 추적 | 4.0+ |
| VoIP | voip | VoIP 퓨시 알림 | 4.0+ |
| BLE | bluetooth-central | BLE 장치와 작업 | 7.0+ |
| Fetch | fetch | 정기 데이터 다운로드 | 7.0+ |
| Processing | processing | 장기 백그라운드 작업 | 13.0+ |
| Push to Talk | push-to-talk | PTT 음성 | 16.0+ |
오디오 백그라운드 모드는 음악 플레이어, 포드캐스트 앱, 오디오 서비스에서 사용되는 가장 일반적인 모드입니다. 앱은 오디오 재생을 계속하고, 제어 센터를 통해 제어되며, 잠금 화면에 나타납니다. 활성화하려면 .playback 카테고리로 AVAudioSession을 구성하면 됩니다.
백그라운드에서 오디오가 작동하려면 AVAudioSession을 구성하고 활성화해야 합니다. .playback 카테고리는 시스템에게 앱이 오디오를 재생하고 있으며 백그라운드에서 활성으로 유지되어야 한다는 것을 알립니다. 이 구성이 없으면 앱을 최소화한 후 5–10초 내에 오디오가 멈춵니다.
import AVFoundation
func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(
.playback,
mode: .default,
options: []
)
try session.setActive(true)
} catch {
print("오디오 세션 오류: \(error)")
}
}
제어 센터 및 잠금 화면과 연동하려면 MPRemoteCommandCenter를 구성해야 합니다. 이는 재생, 일시 정지, 다음 트랙, 이전 트랙 명령을 처리합니다. 메타데이터(트랙 이름, 아티스트, 아트워크, 재생 진행 상황)를 표시하려면 MPNowPlayingInfoProperty를 업데이트해야 합니다.
iOS 14부터는 오디오 백그라운드 모드가 비디오의 Picture in Picture도 지원합니다. 앱을 최소화했을 때 뜨는 창에서 비디오를 계속 표시할 수 있습니다. 활성화하려면 AVPlayerLayer와 함께 AVPictureInPictureController를 사용하십시오. 이 모드는 앱이 오디오 트랙을 재생하는 경우에만 작동합니다.
위치 백그라운드 모드를 통해 앱은 백그라운드에서 위치 업데이트를 수신할 수 있습니다. 네비게이션 앱, 피트니스 트래커, 배달 앱 그리고 소셜 네트워크에서 사용됩니다. 이 모드가 없으면 앱은 백그라운드로 전환될 때 한 번만 위치를 수신하고, 그 후에는 업데이트가 멈춵니다.
CLLocationManager는 여러 추적 전략을 지원합니다: 중요 변경 위치, 표준 위치 추적 그리고 지역 모니터링. 최대 정밀도로 백그라운드에서 작업하려면 allowsBackgroundLocationUpdates = true와 pausesLocationUpdatesAutomatically = false를 사용하십시오.
백그라운드에서의 지속적인 위치 추적은 가장 에너지를 많이 소비하는 시나리오 중 하나입니다. iOS는 자동으로 이동 속도에 따라 업데이트 빈도를 조정합니다. 걸을 때는 10–30초 마다, 운전할 때는 1–5초 마다. 네비게이션에서는 desiredAccuracy = kCLLocationAccuracyBestForNavigation를 사용하십시오.
let locationManager = CLLocationManager()
locationManager.requestAlwaysAuthorization()
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.activityType = .fitness
locationManager.startUpdatingLocation()
significant-change location 모드는 위치 백그라운드 모드 없이 작동합니다. 시스템은 좌표가 중요하게 변경될 때(보통 500m 이상)에만 앱을 께우습니다. 지속적인 GPS가 필요 없어 배터리를 절약합니다. 사용자가 이동할 때 데이터를 업데이트하는 날씨 앱에 적합합니다.
Bluetooth LE 백그라운드 모드를 통해 앱은 백그라운드에서 BLE 장치와 상호작용할 수 있습니다. 피트니스 밴드, 의료 센서, 스마트 홈 장치 그리고 비콘 네비게이션에서 사용됩니다. 모드는 두 가지 하위 유형으로 나낅니다: bluetooth-central(앱이 장치에 연결) 그리고 bluetooth-peripheral(앱이 장치로 동작).
Central로 동작하는 앱은 백그라운드에서 BLE 장치를 스캔하고 연결할 수 있습니다. 이를 위해 Background Modes에서 bluetooth-central을 지정하고 CBCentralManagerScanOptionAllowDuplicatesKey 옵션과 함께 CBCentralManager.scanForPeripherals를 호출하십시오. 백그라운드에서는 스칸 빈도가 줄어덩니다. 시스템은 에너지 절약을 위해 발견을 지연시킬 수 있습니다.
Peripheral로 동작하는 앱은 서비스를 광고하고 다른 장치의 요청에 응답할 수 있습니다. bluetooth-peripheral 모드를 통해 앱은 백그라운드에서도 다른 BLE 장치에 보이게 될 수 있습니다. HealthKit 앱과 IoT 솔루션에서 사용됩니다.
iBeacon 모니터링은 추가 권한 없이 백그라운드에서 작동합니다. 시스템 자체가 Beacon 지역에 들가왔다 나가는 것을 추적합니다. 하지만 Beacon 콘텐츠(proximity UUID, major, minor)를 스캔하려면 Bluetooth 권한과 bluetooth-central Background Mode가 필요합니다. 모니터링에는 CLBeaconRegion으로 CLLocationManager를 사용하십시오.
VoIP 백그라운드 모드는 음성 통신 앱(Skype, Zoom, WhatsApp)을 위해 설계되었습니다. 이 모드를 통해 앱은 수신 전화를 받기 위해 서버에 계속 연결된 상태를 유지할 수 있습니다. iOS 8부터 VoIP에는 PushKit이 사용됩니다. APNs을 거치지 앍고 VoIP 서버의 퓨시 알림을 처리하는 프레임워크입니다.
PushKit은 장치에 VoIP 알림을 전달하는 유일한 메커니즘입니다. PushKit 알림을 수신하면 시스템은 앱이 종료되었더라도 앱을 께우습니다. 앱은 30초 내에 서버와 연결을 설정하고 수신 전화에 대한 로컬 알림을 표시해야 합니다.
import PushKit
class VoIPHandler: NSObject, PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping () -> Void
) {
let caller = payload.dictionaryPayload["caller"] as! String
reportIncomingCall(from: caller)
completion()
}
}
PushKit은 일반 알림에 사용할 수 없습니다. VoIP, watchOS 통신 그리고 파일 제공자에만 사용할 수 있습니다. Apple은 리뷰 중에 이를 확인합니다. 부적절한 사용은 앱 거절로 이어집니다. iOS 13부터 PushKit은 알림만 전달합니다. 통화 화면을 표시하려면 CXProvider(CallKit)을 호출하는 것이 의무입니다.
Background Fetch와 Background Processing은 백그라운드 콘텐츠 업데이트 및 장기 작업을 위한 모드입니다. Fetch는 짧은 정기 업데이트(최대 30초)용, Processing은 조건부(Wi-Fi, 충전) 장기 작업(최대 10분)용입니다. Processing은 iOS 13+에서만 사용 가능합니다.
Fetch 모드를 통해 시스템은 새 콘텐츠를 다운로드하기 위해 주기적으로 앱을 께우일 수 있습니다. 시스템은 사용자 행동을 분석하고 최적의 시간을 선택합니다. 앱은 30초 내에 completion handler를 호출해야 합니다. Fetch는 뉴스 앱, 소셜 미디어 피드 그리고 날씨 앱에 적합합니다.
BGProcessingTask는 사용자 개입 없이 실행할 수 있는 작업(캐시 청소, 대규모 데이터베이스 동기화, 미디어 파일 처리)을 위해 설계되었습니다. 시스템은 유리한 조건(장치 충전 중, Wi-Fi 연결, 저전력 모드 비활성화)에서만 작업을 시작합니다. 최대 10분 간 사용 가능합니다.
BGProcessingTask에서는 requiresExternalPower와 requiresNetworkConnectivity를 지정해야 합니다. 조건이 충족되지 않으면 시스템이 실행을 무기한 미루 수 있습니다. 하루에 한 번 이상 실행되어야 하는 BGAppRefreshTask와 달리, Processing은 장치가 거의 충전되지 않는 경우 수주동안 실행되지 않을 수 있습니다.
Apple은 앱 리뷰 중에 Background Modes의 사용을 엄격히 확인합니다. 기본 규칙: 각 활성화된 모드는 앱의 기능에 의해 정당화되어야 합니다. 앱이 Location Mode를 선언했지만 위치 정보를 사용하지 않는 경우, 기능을 제거하라는 요구와 함께 거절됩니다.
가장 흔한 위반 사항은 다음과 같습니다. Location Mode를 명확한 필요 없이 사용(광고 표시를 위해 “항상” 액세스 요청), 백그라운드 오디오 재생 없는 Audio Mode, PushKit 없는 VoIP, Bluetooth 장치 없는 BLE Mode. Apple은 더 이상 사용되지 않는 모드가 있을 경우 업데이트 단게에서도 앱을 거절할 수 있습니다.
리뷰를 위해 제출할 때는 노트에 각 모드에 대한 구체적인 정당성을 제공하십시오. 예: “Location Background Mode는 피트니스 기능에서 사용자의 경로를 추적하는 데 사용됩니다.” 설명이 없으면 리뷰어가 앱을 거절할 수 있습니다. 기밀 기능(VoIP)의 경우 Apple이 테스트 계정을 요청할 수 있습니다.
필요 최소한의 모드 집합을 사용하십시오. 앱이 시간당 한 번 백그라운드 데이터 다운로드가 필요한 경우 Location Mode를 활성화하지 말고 Fetch나 BGAppRefreshTask를 사용하십시오. 추가 모드는 거절만 초래할 뿔 아니라 부정적인 인상을 주기도 합니다. 사용자가 설정에서 앱이 백그라운드에서 위치 정보를 사용한다는 것을 볼 수 있습니다.
자주 묻는 질문
숫자에 제한은 없지만 각 모드는 앱의 기능에 의해 정당화되어야 합니다. 필요 없이 모든 모드를 활성화하면 리뷰 중에 거절될 가능성이 높습니다. 실제적으로는 앱당 2–3개의 모드가 일반적입니다. 그 이상이면 사용자가 많은 권한 요청을 보게 됩니다.
UIApplication.shared.applicationState를 사용하십시오. 앱이 백그라운드에 있는지(state == .background) 확인할 수 있습니다. 또한 UIApplication.didEnterBackgroundNotification과 willEnterForegroundNotification 알림을 관찰하여 동작을 전환할 수 있습니다.
Audio는 스피커나 헤드폰으로 소리를 재생하는 것입니다. AirPlay는 Apple TV 및 다른 AirPlay 장치로 오디오와 비디오를 스트리밍하는 것입니다. 실제로는 AirPlay가 오디오 세션을 사용하기 때문에 Audio Mode가 둘다를 포그합니다. iOS 7+부터는 별도의 AirPlay 모드가 필요하지 않습니다.
네, 이를 위해 requestAlwaysAuthorization 대신 requestWhenInUseAuthorization()을 사용하십시오. 앱은 포그라운드에서만 위치를 수신합니다. 백그라운드에서 짧은 추적이 필요한 경우 startUpdatingLocation()을 호출하고 willResignActive에서 멈추십시오.
각 모드는 전력 소비를 증가시킵니다. Location Mode가 가장 전력을 많이 소비하며 지속적인 추적으로 배터리수명이 30–50% 감소할 수 있습니다. Audio Mode는 중등(15–20%) 입니다. Fetch와 Processing은 최소(2–5%) 입니다. BLE Mode는 Bluetooth LE의 에너지 효율성 때문에 낮습니다(5–10%).
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.