Location Permission とは、モバイルアプリケーションがユーザーの地理的位置データにアクセスするためにリクエストする許可です。この許可がないと、アプリケーションはデバイスの座標を特定できず、位置情報機能を提供できません。Apple Developer Documentation, 2024 によると、位置情報サービスを使用するすべてのアプリケーションは、システムダイアログを通じてユーザーの明示的な同意を求める必要があります。
重要なポイント
Location Permission は、デバイスの地理的位置データへのアプリケーションのアクセスを制御するオペレーティングシステムのメカニズムです。ユーザーの明示的な同意なしに、アプリケーションはGPS座標、Wi-Fiネットワークデータ、携帯電話基地局情報を取得できません。
モバイルプラットフォームのAndroidとiOSは独自の許可システムを実装していますが、一般的なロジックは同じです。アプリケーションはマニフェストまたは構成ファイルで必要な許可を宣言し、実行時にリクエストします。Android Developers, 2024 によると、Android 10以降、すべての位置情報許可は危険カテゴリに属し、実行時リクエストが必要です。
このアプローチの理由はユーザーのプライバシー保護です。位置データは移動ルートの構築、仕事やレジャーの場所の特定、個人の識別に使用される可能性があります。そのため、両プラットフォームはリクエストダイアログで 透明な説明 を要求しています。アプリケーションは位置情報へのアクセスが必要な理由を明示する必要があります。
位置情報許可 は、機能がユーザーの物理的な位置を知ることに依存するあらゆるアプリケーションに必要です。地図とナビゲーション、デリバリーアプリ、天気サービス、ジオタグ付きソーシャルネットワーク — これらすべてのカテゴリのソフトウェアには Location Permission が必要です。
この許可がないと、アプリケーションは利用可能などの方法でもデバイスの座標を特定できません。GPSモジュール、Wi-Fiスキャン、携帯電話基地局による位置特定のいずれも利用できません。ユーザーはいつでもシステム設定で許可を取り消すことができ、その後アプリケーションは拒否を適切に処理する必要があります。
Pew Research Center (2024) の調査によると、約45%のユーザーが、位置情報を主要機能として使用しないアプリケーションで位置情報へのアクセスを取り消しています。これは、開発者がリクエストを明確に正当化し、Location Permission を拒否したユーザーに代替メカニズムを提供する必要があることを意味します。
欧州のGDPRとロシアの連邦法152-FZは、位置データの処理について インフォームドコンセント を得ることを要求しています。アプリケーションはシステムダイアログを通じて許可をリクエストするだけでなく、データ収集の目的について個別の通知を提供する必要があります。これらの要件に違反すると、最大2000万ユーロまたは企業の年間売上高の4%の罰金が科せられます。
アプリケーションが Location Permission をリクエストしない場合、またはユーザーがアクセスを拒否した場合、開発者は代替シナリオを準備する必要があります。地図アプリケーションの場合は手動アドレス入力、デリバリーアプリの場合は保存済みアドレスリストからの選択、天気サービスの場合はIPアドレスによる都市の特定などです。Graceful degradation(グレースフルデグラデーション)は、GoogleとAppleが推奨する標準的なプラクティスです。
位置情報アクセスレベル はAndroidとiOSで異なりますが、全体的な考え方は同じです。アクセスが正確であればあるほど、プラットフォームはアプリケーションにより厳しい要件を課します。
| アクセスレベル | Android | iOS |
|---|---|---|
| 使用中 | アプリがアクティブな場合のみ | When In Use — アプリ内のみ |
| バックグラウンド | Always — バックグラウンドでも常に | Always — App Storeの追加審査が必要 |
| おおよそ | ACCESS_COARSE_LOCATION(精度最大500m) | Precision = Off オプション(iOS 14+) |
ACCESS_FINE_LOCATION は、最大数メートルの誤差で正確なGPS座標へのアクセスを提供します。マニフェストでこの許可を宣言するには、定数 android.permission.ACCESS_FINE_LOCATION を使用します。ACCESS_COARSE_LOCATION は、Wi-Fiと携帯電話基地局データに基づいて、最大500メートルの精度でおおよその位置を提供します。
When In Use は、アプリケーションが画面に表示されている場合にのみ座標を受信できるようにします。Always はバックグラウンドでも位置情報へのアクセスを提供しますが、App Storeの必須審査が必要です。iOS 14以降、ユーザーは Precision スイッチを使用して、アプリケーションごとに正確な位置情報を個別に無効にできます。
Android での Location Permission のリクエスト は2段階で行われます。マニフェストでの許可の宣言と、コードでの実行時リクエストです。Android 6.0(API 23)以降、すべての危険な許可はインストール時ではなく、アプリケーションの実行時にリクエストされます。
最初のステップは、AndroidManifest.xml ファイルに必要な許可を追加することです。正確な位置特定とおおよその位置特定では異なる定数が使用されます。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
マニフェストでの宣言後、アプリケーションコードで許可リクエストのシステムダイアログを呼び出す必要があります。Activity Result API を使用した Kotlin の例を見てみましょう。
private val locationPermissionRequest =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
when {
permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
// 許可を得ました
getLocation()
}
permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
// おおよその位置のみ
getCoarseLocation()
}
else -> {
// ユーザーが拒否しました
showLocationExplanation()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
checkLocationPermission()
}
ユーザーがアクセスを拒否した場合、Androidシステムは自動的にダイアログを再度表示することを許可しません。開発者は shouldShowRequestPermissionRationale を呼び出して事前説明を表示する必要があります。Never Ask Again フラグ付きで再度拒否された場合は、ユーザーをシステム設定にリダイレクトする必要があります。
private fun checkLocationPermission() {
when {
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED -> {
getLocation()
}
ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION) -> {
showRationaleDialog {
requestLocationPermission()
}
}
else -> {
openAppSettings()
}
}
}
iOS での Location Permission のリクエスト では、Info.plist ファイルに特別なキーを追加し、CLLocationManager クラスのメソッドを呼び出す必要があります。Appleはプライバシーに特に注意を払っているため、リクエストダイアログの説明テキストは可能な限り具体的でなければなりません。
iOSで位置情報をリクエストするには、Info.plist に一方または両方のキーを追加する必要があります。使用中のアクセスには NSLocationWhenInUseUsageDescription、バックグラウンドアクセスには NSLocationAlwaysAndWhenInUseUsageDescription です。各キーの値は、ダイアログでユーザーに表示される文字列です。
<key>NSLocationWhenInUseUsageDescription</key>
<string>アプリがマップ上で近くの地点を表示するには、あなたの位置情報が必要です。</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>ルートを追跡するために、アプリはバックグラウンドでの位置情報へのアクセスが必要です。</string>
Swiftコードでは、CLLocationManager のインスタンスを通じてリクエストが行われます。必要なアクセスレベルに応じて、requestWhenInUseAuthorization または requestAlwaysAuthorization が呼び出されます。
import CoreLocation
class LocationManager: NSObject, CLLocationManagerDelegate {
private let manager = CLLocationManager()
func requestLocationAccess() {
manager.delegate = self
manager.requestWhenInUseAuthorization()
}
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .authorizedWhenInUse, .authorizedAlways:
startLocationUpdates()
case .denied, .restricted:
showSettingsAlert()
case .notDetermined:
break
}
}
}
Androidとは異なり、iOSは開発者に shouldShowRequestPermissionRationale をチェックするメソッドを提供していません。システム自体が説明を表示するタイミングを決定します。さらに、iOSではユーザーはシステム設定からのみ許可を変更できます — アプリケーションはユーザーが選択を行った後、システムダイアログを再度表示することはできません。RequestAlwaysAuthorization は最初に When In Use をリクエストし、最初の同意を得た後、バックグラウンドアクセス用の個別のダイアログを表示します。
Location Permission のベストプラクティス は、ユーザーの拒否を減らし、アプリストアの要件を満たすのに役立ちます。GoogleとAppleは、遵守することでアプリケーション承認の可能性が高まる推奨事項を公開しています。
アプリケーション起動時にすぐに Location Permission リクエストダイアログを表示しないでください。アプリを開いたばかりのユーザーは、なぜ位置情報へのアクセスを提供する必要があるのか理解していません。Contextual request とは、ユーザーが実際に許可を必要とする機能を必要とする瞬間にダイアログが表示されることを意味します。たとえば、“最寄りの店舗を探す” ボタンをクリックしたときなどです。
システムダイアログの前に、独自の説明画面(pre-permission screen)を表示します。その画面で、アプリが位置情報を必要とする理由、収集されるデータ、およびその使用方法を説明します。ユーザーが画面で “許可” をクリックした後、システムダイアログを表示します。Appsflyer (2024) によると、このアプローチにより承認率が25-35%向上します。
バックグラウンドでの位置情報アクセスは、バックグラウンドで動作するアプリケーション(ナビゲーター、アクティビティトラッカー、デリバリーアプリ)にのみ必要です。アプリが画面が開いているときだけ座標を必要とする場合は、When In Use をリクエストしてください。Always が機能的に正当化されない場合、App Storeはアプリケーションを拒否します。Androidでは、バックグラウンドアクセスは ACCESS_BACKGROUND_LOCATION 許可によって追加で規制されています。
よくある質問
アプリケーションは拒否を適切に処理し、代替シナリオを提供する必要があります。たとえば、手動アドレス入力や IPアドレス による都市の特定などです。システムダイアログは再度表示されません — ユーザーを設定にリダイレクトする必要があります。
技術的には可能です — システムダイアログは事前画面なしで表示できます。ただし、説明なしの 承認率 は30-40%であるのに対し、事前画面ありでは60-75%です。AppleとGoogleは常にリクエストの理由を説明することを推奨しています。
定数 Manifest.permission.ACCESS_FINE_LOCATION を指定して ContextCompat.checkSelfPermission を使用します。このメソッドは PERMISSION_GRANTED または PERMISSION_DENIED を返し、システムダイアログを呼び出さずに現在のステータスを確認できます。
ACCESS_FINE_LOCATION は3-10メートルの誤差で正確なGPS座標へのアクセスを提供します。ACCESS_COARSE_LOCATION はWi-Fiと携帯電話基地局に基づいて最大500メートルの精度でおおよその位置を提供します。Android 12+では、開発者は両方の許可を同時にリクエストできます。
Androidでは、BLEデバイスのスキャンには ACCESS_FINE_LOCATION または ACCESS_COARSE_LOCATION が必要です。BLE信号が位置の三角測量に使用される可能性があるためです。iOSでは、BLEにはBluetooth許可のみが必要で、Location Permission は不要です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。