xyk blog

最近は iOS 開発の記事が多めです。

iOS14 での CLLocationManager の変更点

検証環境:
Xcode 12.4
Swift 5.3.2
iOS Deployment Target 14.4

f:id:xyk:20210409193347p:plain

iOS で位置情報を取得するにはCLLocationManagerを使用するのだが、iOS14から使い方が少し変更になったのでメモ。

1つ目がアプリが位置情報サービスの使用するための承認ステータスauthorizationStatusが、以前はクラスメソッドの CLLocationManager.authorizationStatus()
を使って取得していたがこれが Deprecated になり、iOS14からは CLLocationManager のプロパティ
locationManager.authorizationStatus
に変更された。

2つ目が承認ステータスに変更があった時に呼び出される CLLocationManager のデリゲートメソッド
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)
を使っていたがこれが Deprecated になり、iOS14からは
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager)
を使うことになった。

iOS14 で現在位置を取得する簡単なサンプルコード

import UIKit
import CoreLocation

class ViewController: UIViewController {
    
    let locationManager = CLLocationManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        locationManager.delegate = self
        
        if CLLocationManager.locationServicesEnabled() {
            locationManager.requestWhenInUseAuthorization() // 位置情報サービスを使用するために許可を要求する
        } else {
            print("位置情報の使用を許可してください")
        }
    }
}

extension ViewController: CLLocationManagerDelegate {
    
    // ↓iOS14から追加された新しいデリゲートメソッド
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
    
        // ↓iOS14から追加された新しいプロパティ   
        switch manager.authorizationStatus {
        case .notDetermined: // 初回呼び出し時、設定で次回確認を選択時
            print("notDetermined")
            break
        case .restricted: // ペアレンタルコントロールなどの制限あり
            print("restricted")
            break
        case .denied: // 使用拒否した
            print("denied")
            break
        case .authorizedAlways: // いつでも位置情報サービスを開始することを許可した
            print("authorizedAlways")
            manager.startUpdatingLocation() // 位置情報の取得開始
            break
        case .authorizedWhenInUse: // アプリ使用中のみ位置情報サービスを開始することを許可した
            print("authorizedWhenInUse")
            manager.startUpdatingLocation() // 位置情報の取得開始
        @unknown default:
            break
        }
        
        // iOS14から追加された位置情報精度
        switch manager.accuracyAuthorization {
        case .fullAccuracy: // 正確な位置情報
            print("fullAccuracy")
            break
        case .reducedAccuracy: // おおよその位置情報
            print("reducedAccuracy")
            break
        @unknown default:
            break
        }
    }
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        print("didUpdateLocations: \(locations)") //  位置情報の取得成功
        manager.stopUpdatingLocation() // 位置情報の収集終了
    }
    
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("didFailWithError: \(error)") //  位置情報の取得失敗
    }
}

Info.plist に

  • Privacy - Location When In Use Usage Description
    NSLocationWhenInUseUsageDescription

または

  • Privacy - Location Always and When In Use Usage Description
    NSLocationAlwaysAndWhenInUseUsageDescription

の追加も忘れずに。