サンプルコードはいろいろあるが、iOS8で大きな変更があり、従来のコードでは取得できなかったり、取得できても更新できなかったりする。2つの記事を参考に、最終的にコードの順番を変えることで動いた。
2016年7月20日、加筆しました。
最初に参考にしたのは以下の記事:
Info.plistに項目を追加しなければならないのが罠。
これで確かに位置は取得できるが、今度は更新できない。
そこで参考にしたのは以下の記事:
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
こんな感じです:
まとめ
- Info.plistに2つの項目が必要
requestAlwaysAuthorization()
を呼ぶ
これはなかなかハードルが高い。iOS開発は久しぶりだが、最初から「変わってないなあ」という印象。やれやれ。