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〜3キロメートルごとにトリガーされる可能性があります。
他のアプリケーションやシステムサービス(「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は標準的な使用シナリオで1時間あたり約0.1〜0.5%のバッテリー充電を消費するのに対し、継続的なGPSトラッキングは1時間あたり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は1時間に数十のイベントを生成する可能性があります。デバウンスを使用してください:最後の完全な更新の時間を保存し、前回の更新から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アプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。