0Pricing
Swift Academy · レッスン

位置情報の利用許可を求める

権限とプライバシーを適切に扱います。

「位置情報の利用許可を求める」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

位置情報に許可が必要な理由

Appleプラットフォームでは、ユーザーの位置情報へのアクセスはプライバシーに関わる慎重な操作です。Core Locationが座標を配信する前に、アプリで明示的に許可をリクエストする必要があります。初めてリクエストすると、システムによって許可ダイアログが表示されます。

  • 許可はユーザーによってアプリごとに与えられます。
  • プログラムで回避することはできません。
import CoreLocation

let manager = CLLocationManager()

Info.plistの使用目的説明キー

許可をリクエストする前に、Info.plistへ使用目的の説明文字列を追加する必要があります。これらの文字列は許可ダイアログでユーザーに表示されます。主要なキーは次の2つです。

  • NSLocationWhenInUseUsageDescription — フォアグラウンドのみのアクセス用です。
  • NSLocationAlwaysAndWhenInUseUsageDescription — バックグラウンドからのアクセスも含む場合に使用します。

該当するキーを省略すると、リクエストが何も起こらず失敗するか、クラッシュします。

<!-- Info.plist -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>We use your location to show nearby places.</string>

CLLocationManagerの作成

CLLocationManagerは、位置情報サービスを調整する中心的なオブジェクトです。インスタンスを1つ作成して強参照で保持し、コールバックを受け取るためのデリゲートを設定します。

final class LocationService: NSObject {
    let manager = CLLocationManager()

    override init() {
        super.init()
        manager.delegate = self
    }
}

使用中の許可をリクエストする

フォアグラウンドからのアクセスを求めるには、requestWhenInUseAuthorization()を呼び出します。システムがダイアログを表示するのは一度だけで、その後は選択内容が記憶されます。すでに決定済みの場合、呼び出しても何も起こりません。

func requestPermission() {
    manager.requestWhenInUseAuthorization()
}

常に許可をリクエストする

バックグラウンドで更新する場合(ジオフェンシングや継続的なトラッキングなど)は、requestAlwaysAuthorization()を呼び出します。Appleでは、まず「使用中」の許可を取得してから「常に許可」へ移行することが求められます。使用は必要最小限にとどめ、使用目的の説明で理由を示してください。

func requestAlways() {
    manager.requestAlwaysAuthorization()
}

許可状態の読み取り

現在の許可状態はmanager.authorizationStatus(iOS 14以降のインスタンスプロパティ)に保持されています。指定できる値には、.notDetermined、.denied、.restricted、.authorizedWhenInUse、.authorizedAlwaysがあります。

let status = manager.authorizationStatus
switch status {
case .notDetermined: print("Ask the user")
case .denied, .restricted: print("No access")
case .authorizedWhenInUse, .authorizedAlways: print("Good to go")
@unknown default: break
}

CLLocationManagerDelegate

許可状態の変更は、デリゲートを通じて非同期に通知されます。ユーザーが選択したときに対応できるよう、locationManagerDidChangeAuthorization(_:)を実装してください。リクエストを呼び出した直後に許可されていると決めつけてはいけません。

extension LocationService: CLLocationManagerDelegate {
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        switch manager.authorizationStatus {
        case .authorizedWhenInUse, .authorizedAlways:
            manager.startUpdatingLocation()
        default:
            print("Not authorized")
        }
    }
}

拒否または制限への対応

ユーザーがアクセスを拒否した場合、許可を再度求めることはできません。代わりに.deniedを検出し、ユーザーを設定へ案内してください。.restrictedは、ペアレンタルコントロールまたはMDMプロファイルによってアクセスがブロックされていることを示し、これもアプリ内では復旧できません。

func handle(_ status: CLAuthorizationStatus) {
    if status == .denied {
        // Deep-link the user to Settings > Privacy > Location
        print("Open Settings to enable location")
    }
}

精度の許可(正確な位置情報とおおよその位置情報)

iOS 14以降では、ユーザーは低精度(おおよその位置情報)のみを許可できます。manager.accuracyAuthorizationを確認してください。本当に正確なデータが必要な場合(ターンバイターン方式のナビゲーションなど)は、Info.plistで定義したキーを指定してrequestTemporaryFullAccuracyAuthorization(withPurposeKey:)を呼び出します。

if manager.accuracyAuthorization == .reducedAccuracy {
    manager.requestTemporaryFullAccuracyAuthorization(
        withPurposeKey: "PreciseForNavigation"
    )
}

位置情報サービスが有効か確認する

アプリごとの許可とは別に、デバイス全体の位置情報サービスの切り替えがオフになっている場合があります。バックグラウンドキューでCLLocationManager.locationServicesEnabled()を確認してください(メインスレッドで呼び出すとブロックする可能性があります)。無効になっている場合、どのアプリも位置情報を受け取れません。

DispatchQueue.global().async {
    if CLLocationManager.locationServicesEnabled() {
        print("System location is on")
    } else {
        print("System location is off")
    }
}

許可フローの全体像

ここまでをまとめると、マネージャーを作成してデリゲートを設定し、「使用中」の許可をリクエストしてから、許可状態のコールバック内で更新を開始します。これは、位置情報を利用する機能全般に適用できる標準的なパターンです。

final class LocationService: NSObject, CLLocationManagerDelegate {
    let manager = CLLocationManager()
    override init() {
        super.init()
        manager.delegate = self
        manager.requestWhenInUseAuthorization()
    }
    func locationManagerDidChangeAuthorization(_ m: CLLocationManager) {
        if m.authorizationStatus == .authorizedWhenInUse {
            m.startUpdatingLocation()
        }
    }
}

クイックチェック:許可

許可フローの理解度を確認します。

まとめ:許可のリクエスト

位置情報へのアクセス許可を安全にリクエストする方法を学びました。

  • NSLocationWhenInUseUsageDescription(必要ならAlways版も)をInfo.plistに追加します。
  • CLLocationManagerを作成し、強参照で保持してデリゲートを設定します。
  • requestWhenInUseAuthorization()を呼び出し、必要な場合に限って「常に許可」へ移行します。
  • locationManagerDidChangeAuthorization(_:)で状態の変化に対応し、拒否、制限、低精度のケースを処理します。

よくある質問

「位置情報の利用許可を求める」レッスンは無料ですか?

はい。「位置情報の利用許可を求める」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「位置情報の利用許可を求める」で何を学びますか?

権限とプライバシーを適切に扱います。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「位置情報の利用許可を求める」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 位置情報の利用許可を求める
  2. ユーザーの位置情報を取得する
  3. SwiftUIで地図を表示する
  4. ジオコーディングとリージョン
← Swift Academyに戻る