Feel Physics Backyard

HoloLensの出張授業をする会社で、教材を開発しています

単純に位置情報を取得・更新する方法(iOS9) 仕様変更が罠

f:id:weed_7777:20160706123138p:plain

サンプルコードはいろいろあるが、iOS8で大きな変更があり、従来のコードでは取得できなかったり、取得できても更新できなかったりする。2つの記事を参考に、最終的にコードの順番を変えることで動いた。

2016年7月20日、加筆しました。

最初に参考にしたのは以下の記事:

qiita.com

Info.plistに項目を追加しなければならないのが罠。

これで確かに位置は取得できるが、今度は更新できない。

そこで参考にしたのは以下の記事:

logstack.biz

requestWhenInUseAuthorizationが必要だという。コードの下に追加したが位置更新できず、記述順序も記事通りにしたらやっと動いた。最終コードは以下の通り:

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {
    
    var lm: CLLocationManager!
    var longitude: CLLocationDegrees!
    var latitude : CLLocationDegrees!
    
    @IBOutlet var lonLabel: UILabel!
    @IBOutlet var latLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        lm = CLLocationManager()
        lm.delegate = self
        //これが最後の罠。ここに書く。ダイアログを出さないと審査で却下される。
        if CLLocationManager.authorizationStatus() != CLAuthorizationStatus.AuthorizedWhenInUse {
            lm?.requestWhenInUseAuthorization()
        }
        lm.desiredAccuracy = kCLLocationAccuracyBest
        lm.distanceFilter = kCLDistanceFilterNone
        
        lm.startUpdatingLocation()
    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        longitude = locations[0].coordinate.longitude
        latitude  = locations[0].coordinate.latitude

        lonLabel.text = String(longitude)
        latLabel.text = String(latitude)
    }
}

これに加えて、info.plistに以下のkeyが存在しないとlocationManagerメソッドが呼ばれない。

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

こんな感じです:

f:id:weed_7777:20160720103040p:plain

まとめ

  • Info.plistに2つの項目が必要
  • requestAlwaysAuthorization()を呼ぶ

これはなかなかハードルが高い。iOS開発は久しぶりだが、最初から「変わってないなあ」という印象。やれやれ。