モバイルアプリにおけるGPSと位置情報サービスは、衛星、Wi-Fi、モバイルネットワークを使用してデバイスの物理的な位置を特定するためのAPIです。Google Android Location Guide (2025)によると、モバイルアプリの60%以上がコンテンツのパーソナライズに位置情報データを使用しています。AndroidのFused Location Providerは、複数のソースを組み合わせて精度を向上させ、電力消費を削減します。
主要ポイント
GPS(グローバル・ポジショニング・システム)は、約20,200kmの軌道上に31基の運用衛星を持つ衛星航法システムです。モバイルデバイスでは、GPSチップが衛星から信号を受信し、三角測量(複数の衛星からの信号伝播時間の測定)に基づいて座標を計算します。モバイルOSの位置情報サービスは、より高速な測位(A-GPS)と屋内での精度向上のために、GPSにWi-Fiアクセスポイントと携帯電話基地局のデータを追加します。GPS.gov(2024年)によると、民生用GPSの精度は晴天時で3〜5メートル、密集した都市部では最大15メートルです。
最新のモバイルデバイスは、米国のGPSシステムだけでなく、ロシアのGLONASS(24基)、欧州のGalileo(28基)、中国のBeiDouなどの他の全球測位衛星システムもサポートしています。複数のシステムを同時にサポートすることで、測位の精度と速度が向上します。デバイスは、異なるシステムの最大40基の衛星を使用して位置を計算できます。iOSとAndroidでは、衛星システムの選択はハードウェアチップレベルで自動的に行われ、開発者が管理する必要はありません。
モバイルデバイスでの位置特定プロセスは、ソース(衛星、Wi-Fi、セル)からのデータ収集、エラーのフィルタリングと補正、座標の計算、アプリへの結果の配信の複数の段階で構成されています。オペレーティングシステムは、バッテリー節約のためにすべてのソースを最適化する統合位置情報サービスを通じてこのプロセスを管理します。以下に、位置情報データの3つの主要なソースを示します。
衛星航法は最大の精度(3〜5メートル)を提供しますが、空がはっきり見える必要があります。屋内や密集した都市部では、GPS信号が弱まったり完全に失われたりする可能性があります。最初の測位までの時間(TTFF)は、コールドスタートで30〜60秒、ホットスタートで5〜10秒です。A-GPS(アシストGPS)は、衛星からのデータを待つ代わりにインターネット経由で衛星暦データをダウンロードすることで、起動を高速化します。
Wi-Fi測位は、既知の座標を持つアクセスポイントのMACアドレスのデータベースを使用します。Wi-Fiカバレッジ内での精度は10〜50メートルです。携帯電話基地局は、基地局の密度に応じて100メートルから数キロメートルの精度を提供します。すべてのソース(Fused Location)を組み合わせることで、GPSチップがオフの場合や衛星信号が利用できない場合でも、最小限の電力消費で適切な精度の座標を取得できます。
両方のプラットフォームで、位置情報サービスは異なる抽象化レベルでシステムAPIを通じて実装されています。AndroidはGoogle Play ServicesのFusedLocationProviderClientを使用し、iOSはCore LocationのCLLocationManagerを使用します。両方のAPIで、1回限りの位置情報のリクエストや定期的な更新のサブスクライブが可能です。以下は、KotlinでFused Location Providerを使用してAndroidで座標を取得する例です。
val fusedClient = LocationServices.getFusedLocationProviderClient(this)
val locationRequest = LocationRequest.Builder(
Priority.PRIORITY_HIGH_ACCURACY
)
.setIntervalMillis(5000)
.setMinUpdateIntervalMillis(2000)
.build()
val locationCallback = object : LocationCallback() {
override fun onLocationResult(result: LocationResult) {
result.lastLocation?.let { location ->
Log.d("位置", "Lat: ${location.latitude}, Lng: ${location.longitude}")
}
}
}
if (checkLocationPermission()) {
fusedClient.requestLocationUpdates(
locationRequest, locationCallback,
Looper.getMainLooper()
)
}
この例では、LocationRequestがPRIORITY_HIGH_ACCURACYで設定されています。これにより、最大精度のためにGPSが有効になります。setIntervalMillisは希望する更新間隔(5秒)を設定し、setMinUpdateIntervalMillisは最小間隔(2秒)を設定します。onLocationResultコールバックは、システムが新しい座標を受け取るたびに呼び出されます。requestLocationUpdatesを呼び出す前に権限を確認することが重要です。確認しないと、アプリはSecurityExceptionでクラッシュします。
import CoreLocation
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// マーク: - CLLocationManagerDelegate
func locationManager(
_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]
) {
guard let location = locations.last else { return }
print("Location: \(location.coordinate.latitude), \(location.coordinate.longitude)")
}
iOSでは、desiredAccuracyがリクエストの精度を決定します。kCLLocationAccuracyBestは利用可能なすべてのソース(GPS + Wi-Fi + セル)を使用します。requestWhenInUseAuthorizationを介して権限をリクエストした後、システムはユーザーにダイアログを表示します。didUpdateLocationsデリゲートは、座標、高度、速度、方位を持つCLLocationオブジェクトの配列を受け取ります。更新を停止するには、バッテリーを節約するためにstopUpdatingLocationを呼び出します。
位置情報へのアクセスには、両方のプラットフォームでユーザーの明示的な許可が必要です。Androidでは、ACCESS_FINE_LOCATION(GPS)とACCESS_COARSE_LOCATION(Wi-Fi/セル)の権限が使用されます。Android 10以降、バックグラウンドアクセスには別の権限ACCESS_BACKGROUND_LOCATIONが必要です。iOSでは、requestWhenInUseAuthorization(アプリがアクティブな場合のみ)、requestAlwaysAuthorization(バックグラウンド)、および正確な測位のための一時的なタイムスタンプの3つのレベルが利用可能です。AppleはInfo.plistでの必須の説明を要求しています:NSLocationWhenInUseUsageDescriptionまたはNSLocationAlwaysAndWhenInUseUsageDescription。これらのキーがないと、許可リクエストは無視されます。
GPSの継続的な使用はバッテリーを大幅に消費します。最大精度での連続運転で1時間あたり最大30%です。電力消費を最適化するには、必要な場合にのみ位置情報を使用し、アプリがバックグラウンドに入ったら更新を停止することをお勧めします。Androidでは、FusedLocationProviderClientは利用可能性とリクエストの優先順位に応じて、GPSとネットワークソースを自動的に切り替えます。iOSでは、最小の電力消費で更新を行うために、significant-change location service(startMonitoringSignificantLocationChanges)を使用します。精度は低くなりますが(最大500メートル)、バッテリーはほとんど消費されません。また、バッチ処理を実践してください。5〜10分間隔で座標を収集し、AndroidのWorkManagerまたはiOSのBGTaskSchedulerを介してサーバーに1つのリクエストで送信します。リクエスト頻度を1秒から30秒に減らすと、位置情報の電力消費が85%削減されます。
位置情報は、ナビゲーションアプリから配送サービスまで、幅広いモバイルアプリで使用されています。最も一般的なシナリオには、地図上でのユーザー表示、ジオターゲティング広告、配達員の追跡、プッシュ通知のためのジオフェンシング、フィットネスアクティビティの追跡が含まれます。各シナリオには、精度と更新頻度に関する独自のアプローチが必要です。以下は、さまざまなアプリタイプの設定推奨事項をまとめた表です。
| アプリタイプ | 精度 | 間隔 | バックグラウンドモード |
|---|---|---|---|
| ナビゲーション | HIGH (GPS) | 1〜2秒 | あり |
| 配送 | BALANCED (GPS+Wi-Fi) | 10〜30秒 | あり |
| 天気 | LOW (Wi-Fi/セル) | 1回 | なし |
| ソーシャルネットワーク | BALANCED | 開く時 | なし |
| フィットネス | HIGH (GPS) | 5〜10秒 | あり |
位置情報機能を設計する際は、ユーザーがシステム設定からいつでも許可を取り消すことができることを考慮することが重要です。アプリは、位置情報が利用できない状況を適切に処理し、機能が制限されている理由を明確に説明する必要があります。
Geofencingは、地図上に仮想的な境界線を作成する技術です。これらの境界線を越えると、アプリは通知を受け取ります。Androidでは、ジオフェンスはGoogle Play ServicesのGeofencingClientを介して実装され、iOSではCore LocationのCLCircularRegionを介して実装されます。ゾーンに出入りすると、アプリが閉じられたり最小化されていても、システムはアプリを起動してイベントを送信します。これは、店舗に近づいたときのプッシュ通知、位置情報ベースのタスクリマインダー、IoTデバイスの自動化に使用されます。ジオフェンスの最大数は制限されています。Androidでは100、iOSでは同時に20です。最小ゾーン半径は両方のプラットフォームで50メートルです。これより小さいと、位置測位の誤差によりシステムがトリガーされない可能性があります。ゾーンに入ると、システムはAndroidでIntentを開始するか、iOSでlocationManager:didEnterRegionデリゲートを呼び出します。
よくある質問
スマートフォンのGPSは、衛星航法システムの信号を受信する内蔵レシーバーで、3〜5メートルの精度で座標を特定します。デバイスは精度と測位速度を向上させるためにGLONASS、Galileo、BeiDouもサポートしています。
GPSは座標を決定するための衛星方式にすぎません。位置情報サービスは、特に屋内でのより高速でエネルギー効率の高い位置特定のために、GPS、Wi-Fi測位、携帯電話基地局データを組み合わせます。
CLLocationManagerインスタンスでrequestWhenInUseAuthorization()またはrequestAlwaysAuthorization()を呼び出します。最初に、位置情報が必要な理由の明確な説明を記述したNSLocationWhenInUseUsageDescriptionをInfo.plistに追加してください。
AndroidではFusedLocationProviderClient、iOSではsignificant-change location serviceを使用します。リクエスト間隔を10〜30秒に増やし、画面がオフのときに更新を停止し、サーバーへの座標のバッチ送信を適用します。
はい、GPSがなくても、Wi-Fiアクセスポイント(精度10〜50メートル)または携帯電話基地局(精度100〜5000メートル)を使用しておおよその位置を特定できます。Androidでは、これにACCESS_COARSE_LOCATIONが使用されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。