javaSEがiOSアプリデザイン、開発に挑む日記

本業java SEがswift、デザインの勉強したことを残しておくブログ

swift 現在地取得

iOSシミュレータで動作確認がうまくいったりいかなかったりするけど

実機でテストするとちゃんと取れる。

iPadの実機とかも揃えようか...

 

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        // 現在地の取得.
        myLocationManager = CLLocationManager()
        myLocationManager.delegate = self
        
        // 取得精度の設定.
        myLocationManager.desiredAccuracy = kCLLocationAccuracyBest
        // 取得頻度の設定.
        myLocationManager.distanceFilter = 100

        // セキュリティ認証のステータスを取得.
        let status = CLLocationManager.authorizationStatus()
        
        // まだ認証が得られていない場合は、認証ダイアログを表示.
        if(status == CLAuthorizationStatus.NotDetermined) {
            println("didChangeAuthorizationStatus:\(status)");
            // まだ承認が得られていない場合は、認証ダイアログを表示.
            self.myLocationManager.requestAlwaysAuthorization()
        }else{
            myLocationManager.startUpdatingLocation()
        }
        
        
        // Do any additional setup after loading the view, typically from a nib.
    }

    // 認証ステータスが変更された際に呼ばれるデリゲート
    func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        
        // 認証のステータスをログで表示.
        var statusStr = "";
        switch (status) {
        case .NotDetermined:
            statusStr = "NotDetermined"
        case .Restricted:
            statusStr = "Restricted"
        case .Denied:
            statusStr = "Denied"
        case .AuthorizedAlways:
            statusStr = "AuthorizedAlways"
            myLocationManager.startUpdatingLocation()
        case .AuthorizedWhenInUse:
            statusStr = "AuthorizedWhenInUse"
            myLocationManager.startUpdatingLocation()
        }
        println(" CLAuthorizationStatus: \(statusStr)")
    }
    
    
    // 位置情報取得に成功したときに呼び出されるデリゲート.
    func locationManager(manager: CLLocationManager!,didUpdateLocations locations: [AnyObject]!){
        // 緯度・経度の表示.
        
        var lat = manager.location.coordinate.latitude
        var lon = manager.location.coordinate.longitude
        
        println("\(NSDate()) geo is :\(lat),\(lon)")
    
        // 位置情報を常に動作させない場合は止める
        manager.stopUpdatingLocation()
                
    }
    
    // 位置情報取得に失敗した時に呼び出されるデリゲート.
    func locationManager(manager: CLLocationManager!,didFailWithError error: NSError!){
        println("error")
        manager.stopUpdatingLocation()
    }

 ジムとかで

地図アプリを起動したままロッカーに入れると電池が劇的に減るのは

位置情報が取りにくい場所で更新がものすごい頻度でされるからなんでしょうね

きっと。

 

とりあえず、天気予報アプリを想定して、起動時にのみ取得。

(取得したらstopUpdatingLocation()を実施)

 

あと忘れてはいけないのは以下

  1. info.plistにkey「NSLocationAlwaysUsageDescription」を追加(Valueには位置情報を常に取得する確認アラート表示に出る文言を記述)
  2.  iOSシミュレータで確認時はメニューの【debug】→【location】を「none」以外に設定する

xcodeの下の方で設定できる「simulate location」は上手くいく時はここの位置が取れるけど、設定してもエラーになる時があったり。