Significant Location Change(SLC)는 디바이스의 큰 이동을 모니터링하는 iOS 서비스로, 지리적 좌표에 중요한 변경이 있을 때만 애플리케이션에 알립니다. 실시간 GPS 추적과 달리 SLC는 위치 확인에 셀룰러 타워를 사용하므로 최소한의 에너지 소비를 보장합니다. 문서에 따르면 Apple Developer, 2025, Significant Location Change는 GPS를 지속적으로 작동시키지 않고도 애플리케이션이 위치 정보 업데이트를 받을 수 있게 하여, 연속 추적과 비교해 최대 90%의 배터리를 절약합니다.
핵심 사항
Significant Location Change(SLC)는 Core Location 프레임워크에 내장된 iOS의 에너지 효율적인 위치 서비스입니다. GPS 모듈을 지속적으로 사용하지 않고도 사용자의 큰 이동을 추적해야 하는 애플리케이션을 위해 설계되었습니다. SLC는 셀룰러 통신 셀 간 전환 시 자동으로 활성화되며, CLLocationManagerDelegate 델리게이트를 통해 didUpdateLocations 메서드로 애플리케이션에 알립니다.
GPS 수준 추적(표준 startUpdatingLocation)과 달리 SLC는 프로세서와 GPS 칩의 지속적인 활성화가 필요하지 않습니다. iOS는 대략적인 위치 파악을 위해 셀룰러 타워의 신호를 사용하며, 좌표에 큰 차이가 있을 때만 애플리케이션을 실행합니다. 이를 통해 애플리케이션은 업데이트 사이에 “절전” 상태가 되어 최소한의 에너지만 소비합니다.
SLC는 iOS 5부터 셀룰러 모듈이 있는 모든 디바이스에서 사용할 수 있습니다. iPod Touch 및 iPad Wi-Fi 모델에서는 좌표 확인에 셀룰러 타워를 사용하므로 이 서비스를 사용할 수 없습니다. Core Location은 어떤 이벤트를 중요한 것으로 간주할지 자동으로 결정합니다. 개발자는 SLC의 민감도를 조정하거나 트리거의 최소 거리를 지정할 수 없습니다.
SLC는 높은 위치 정확도가 필요하지 않은 애플리케이션에 이상적입니다: 날씨 추적기, 배달 서비스, 주변 물건 찾기 앱, 방문 장소 분석 등. SLC는 iOS 시스템에서 지오펜싱(Geofencing)을 절전 모드로 활성화하는 데도 사용됩니다. 내비게이션 애플리케이션은 더 정확한 GPS 추적이 필요합니다.
Significant Location Change는 디바이스가 네트워크에 연결될 때 획득하는 셀룰러 타워 식별자(Cell ID) 분석을 기반으로 작동합니다. iOS는 GPS를 켜지 않고도 타워 좌표의 데이터베이스를 유지하며 대략적인 위치를 파악할 수 있습니다. 디바이스가 새 타워로 전환하면 시스템은 새 위치와 이전 위치를 비교하고, 차이가 중요하면 이벤트를 처리하기 위해 애플리케이션을 실행합니다.
시스템은 클러스터 접근 방식을 사용합니다: 지리적 공간은 특정 반경의 클러스터로 나뉩니다. SLC는 클러스터 경계를 넘을 때만 이벤트를 생성하며, 내부의 미세한 이동마다 생성하지 않습니다. 이는 동일한 커버리지 영역 내(예: 건물이나 지역 내)에서 이동할 때 애플리케이션 호출이 급증하는 것을 방지합니다. 정확도는 셀룰러 타워 밀도에 따라 500미터에서 수 킬로미터까지 다양합니다.
iOS가 중요한 변경을 감지하면 애플리케이션을 백그라운드 상태에서 깨우고(실행 중인 경우) 이벤트를 Core Location 델리게이트로 보냅니다. 애플리케이션은 처리를 위해 짧은 시간(백그라운드 시간 약 10~30초)을 받습니다. 이 시간 동안 좌표를 처리하고 필요시 GPS를 통해 더 정확한 업데이트를 예약해야 합니다.
SLC는 Suspended 또는 Background 상태에서 애플리케이션을 깨우는 특권이 있습니다. 메모리 부족으로 시스템에 의해 애플리케이션이 종료된 경우, SLC는 백그라운드에서 이를 다시 시작합니다(relaunch). 이를 위해 애플리케이션은 didFinishLaunchingWithOptions 메서드에서 UIApplication.LaunchOptionsKey.location에 서명해야 합니다. 이벤트 처리 후 시스템은 애플리케이션을 다시 Suspended 상태로 되돌릴 수 있습니다.
트리거는 iOS 시스템에 의해서만 결정됩니다. 개발자는 프로그래밍 방식으로 어떤 좌표 변경을 “중요”하다고 간주할지 제어할 수 없습니다. 그러나 SLC가 보장된 이벤트를 생성하는 문서화된 시나리오가 몇 가지 있습니다. 이러한 트리거를 이해하면 개발자가 올바른 애플리케이션 동작을 설계하는 데 도움이 됩니다.
Cell tower change는 SLC의 주요 트리거입니다. 디바이스가 셀룰러 타워 간을 전환할 때(도시나 고속도로에서 이동 시), 시스템은 이전 타워와 새 타워 간에 좌표가 충분히 변경되었는지 확인합니다. 변경되었다면 이벤트가 생성됩니다. 타워 네트워크가 밀집된 도시 지역에서는 SLC가 1~3km마다 트리거될 수 있습니다.
다른 애플리케이션이나 시스템 서비스(예: “iPhone 찾기”, 내비게이션)가 GPS 모듈을 활성화하면 SLC도 정확한 좌표 업데이트를 받을 수 있습니다. 이는 부수적 효과입니다: GPS가 정확한 위치를 파악하고 iOS가 이를 SLC에 등록된 모든 애플리케이션에 전송합니다. 그러나 이 트리거에 의존할 수는 없습니다. 보장되지 않습니다.
SLC는 직접 Wi-Fi를 사용하지 않지만, 디바이스가 Apple Location Service(Wi-Fi 데이터베이스를 통한 위치)를 통해 새 좌표를 받는 경우 Wi-Fi 네트워크 변경이 간접적으로 이벤트를 유발할 수 있습니다. iOS는 Wi-Fi 액세스 포인트의 좌표를 해시하고 타워 변경 사이의 위치를 보정하는 데 사용합니다.
| 트리거 | 보장 | 지연 | 정확도 |
|---|---|---|---|
| 셀룰러 타워 변경 | 높음 | 1~30초 | 500m~3km |
| 타 앱의 GPS | 낮음 | 즉시 | 최대 10m |
| Wi-Fi 변경 | 중간 | 최대 5분 | 100~500m |
iOS는 위치 정보를 얻기 위한 여러 메커니즘을 제공하며, 각각 고유한 정확도, 에너지 소비 및 사용 시나리오가 있습니다. Significant Location Change는 타워에 의한 대략적인 근사와 정확한 GPS 추적 사이의 중간에 위치하며, 실시간 높은 정확도가 필요하지 않은 애플리케이션에 균형 잡힌 옵션을 제공합니다.
Standard Location Service(startUpdatingLocation())는 GPS, Wi-Fi 및 셀룰러 타워를 사용하여 좌표를 최대한 정확하게 파악합니다. 정확도는 최대 10미터이지만 에너지 소비가 높으며 GPS 모듈이 지속적으로 활성화됩니다. 내비게이션, 피트니스 트래커, AR 애플리케이션에 적합합니다. 반면 SLC는 지속적으로 GPS를 사용하지 않으며 정확도는 500미터 이하입니다.
Region Monitoring은 지정된 지리적 영역의 출입을 추적합니다. SLC와 달리 개발자가 직접 영역의 경계를 정의합니다(반경 100미터부터). 지오펜싱은 SLC를 보조 메커니즘으로 사용합니다. 시스템이 먼저 SLC로 대략적인 위치를 파악한 다음 GPS를 켜서 영역 출입을 정확히 감지합니다. 최대 수는 20개의 영역까지 추적 가능합니다.
Visit Monitoring은 iOS 8+의 전문 서비스로, 장소 방문(도착 및 출발)을 추적합니다. SLC와 다른 신호를 조합하여 사용자가 어딘가에 머물렀는지와 언제 떠났는지 판단합니다. Visit Monitoring은 SLC보다 에너지 효율이 높으며, 이벤트 생성이 적고 기기에서 머신 러닝을 활용합니다.
| 서비스 | 정확도 | 에너지 소비 | 백그라운드 |
|---|---|---|---|
| SLC | 500m~3km | 매우 낮음 | 예 |
| Standard GPS | 최대 10m | 높음 | 권한 필요 |
| Geofencing | 100m~ | 낮음 | 예 |
| Visit Monitoring | 최대 100m | 매우 낮음 | 예 |
SLC는 Visit Monitoring을 제외하면 iOS에서 위치 정보를 얻는 가장 에너지 효율적인 방법입니다. Apple에 따르면 SLC는 일반적인 사용 시나리오에서 시간당 약 0.1~0.5%의 배터리를 소비하는 반면, 연속 GPS 추적은 시간당 5~10%를 소비할 수 있습니다. 절약이 가능한 이유는 GPS 모듈이 각 이벤트에서 좌표를 확인하기 위해 짧은 시간만 활성화되기 때문입니다.
iOS는 배터리 최적화를 통해 SLC의 에너지 소비를 관리합니다. 시스템이 애플리케이션이 SLC 이벤트를 너무 자주 처리하고 있다고 감지하면(예: 기차 이동 중 빈번한 타워 변경이 많은 이벤트를 생성하는 경우), iOS가 일시적으로 알림 빈도를 줄일 수 있습니다. 이는 자동 메커니즘으로 개발자는 비활성화할 수 없습니다.
주요 iOS 릴리스가 나올 때마다 Apple은 위치 정보에 대한 백그라운드 액세스를 강화하고 있습니다. iOS 13부터 백그라운드 위치 사용 권한 요청 대화상자가 변경되었습니다: 사용자는 “앱 사용 중”(While Using)뿐만 아니라 명시적으로 “항상”(Always)를 선택해야 합니다. Always 권한이 없으면 애플리케이션이 백그라운드에 있거나 시스템에 의해 종료된 경우 SLC가 작동하지 않습니다.
Swift에서 Significant Location Change의 전체 구현 예제를 살펴보겠습니다. 이 예제에는 CLLocationManager 설정, Always 권한 요청, 모니터링 시작, 이벤트 처리 및 시스템 종료 후 애플리케이션 재시작 지원이 포함됩니다. 코드는 좌표 처리와 BGTaskScheduler를 통한 백그라운드 작업을 위해 async/await와 함께 최신 Swift를 사용합니다.
import CoreLocation
import UIKit
class LocationManager: NSObject, CLLocationManagerDelegate {
private let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
manager.pausesLocationUpdatesAutomatically = true
manager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
}
func requestAlwaysAuthorization() {
manager.requestAlwaysAuthorization()
}
func startSignificantLocationUpdates() {
manager.startMonitoringSignificantLocationChanges()
}
func locationManager(_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
Task.detached {
await LocationProcessor.handleLocationUpdate(location)
}
}
func locationManager(_ manager: CLLocationManager,
didFailWithError error: Error) {
Logger.log("SLC error: \(error.localizedDescription)")
}
}
애플리케이션이 시스템에 의해 종료된 경우, SLC는 새 이벤트 발생 시 자동으로 재시작합니다. AppDelegate에서 UIApplication.LaunchOptionsKey.location을 통한 위치 이벤트 실행 확인을 추가해야 합니다. 재시작 후 애플리케이션은 CLLocationManager를 초기화하고 모니터링을 계속하기 위해 startMonitoringSignificantLocationChanges()를 호출해야 합니다.
class AppDelegate: NSObject, UIApplicationDelegate {
private let manager = LocationManager()
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if launchOptions?.keys.contains(.location) == true {
Logger.log("App relaunched by SLC event")
}
manager.requestAlwaysAuthorization()
manager.startSignificantLocationUpdates()
return true
}
}
Significant Location Change의 올바른 사용은 기능성과 에너지 효율성 사이의 균형이 필요합니다. Apple은 위치 정보의 백그라운드 액세스를 엄격히 통제하며, SLC를 남용하거나 명확한 필요 없이 사용하는 애플리케이션은 App Store에 게시될 때 거부될 위험이 있습니다.
Info.plist에 설명 문자열을 추가해야 합니다: NSLocationAlwaysAndWhenInUseUsageDescription과 NSLocationWhenInUseUsageDescription. 설명은 애플리케이션이 위치 정보의 백그라운드 액세스가 필요한 이유를 명확히 설명해야 합니다. App Review는 이 문자열을 읽고 이유가 충분하지 않거나 표현이 모호하면 애플리케이션을 거부할 수 있습니다. 예: “이 앱은 사용자의 위치 변화에 따라 날씨 예보를 업데이트하기 위해 SLC를 사용합니다.”
모든 SLC 이벤트에서 고비용 작업(GPS 위치 확인, 네트워크 요청)을 실행하지 마세요. 교통수단 이동 중 SLC는 시간당 수십 개의 이벤트를 생성할 수 있습니다. 디바운싱을 사용하세요: 마지막 전체 업데이트 시간을 저장하고 이전 업데이트 후 5~10분 미만이 경과했으면 처리를 건너뜁니다. 이렇게 하면 배터리와 네트워크 트래픽이 절약됩니다.
SLC 이벤트 후 장시간 처리에는 BGTaskScheduler를 사용하세요. 애플리케이션이 SLC 이벤트를 받으면 BGProcessingTaskRequest 또는 BGAppRefreshTaskRequest를 통해 백그라운드 작업을 예약할 수 있습니다. 이를 통해 리소스 집약적 작업(서버 동기화, 경로 분석)을 다가오는 백그라운드 실행 윈도우로 연기하여 SLC 응답의 메인 스레드를 차단하지 않습니다.
자주 묻는 질문
Significant Location Change(SLC)는 셀룰러 타워를 기반으로 디바이스의 큰 이동을 모니터링하는 iOS의 에너지 효율적인 서비스입니다. 연속 GPS 추적보다 최대 90% 적은 에너지를 소비하며, 높은 위치 정확도가 필요하지 않은 애플리케이션에 적합합니다.
SLC의 정확도는 셀룰러 타워 밀도에 따라 500미터에서 3킬로미터까지 다양합니다. 도시 지역에서는 정확도가 높고(500m에 가까움), 시골 지역에서는 낮아집니다(수 킬로미터까지). SLC는 정확한 좌표 파악을 위한 것이 아닌, 이동의 대략적인 모니터링을 위한 리소스입니다.
Info.plist에 NSLocationAlwaysAndWhenInUseUsageDescription 문자열을 추가한 후 CLLocationManager.requestAlwaysAuthorization()을 호출하세요. iOS 13부터 사용자는 시스템 대화상자에서 명시적으로 “항상”(Always)을 선택해야 합니다. 이 권한 없이 SLC는 백그라운드에서 작동하지 않습니다.
네, SLC는 메모리 부족으로 시스템에 의해 종료된 애플리케이션을 재시작할 수 있습니다. 실행 시 didFinishLaunchingWithOptions 메서드에서 UIApplication.LaunchOptionsKey.location을 확인하고 모니터링을 계속하려면 startMonitoringSignificantLocationChanges()를 호출하세요.
SLC는 셀룰러 타워만 사용하고 지속적으로 GPS를 켜지 않아 최대 90%의 배터리를 절약합니다. 정확도는 500m~3km입니다. Standard Location Service는 GPS, Wi-Fi 및 타워를 사용하며 정확도는 최대 10m이지만 훨씬 더 많은 에너지를 소비합니다. SLC는 백그라운드 모니터링에, GPS는 내비게이션에 적합합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.