Swift

Swiftで現在地を取得してみた

More than 1 year has passed since last update.

Swiftで現在地を取得するのにかなり手間取ったので、メモを残しておきます。

現在地の緯度と経度を画面に表示させています。

ViewController.swift
import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    var lm: CLLocationManager! = nil
    var longitude: CLLocationDegrees!
    var latitude: CLLocationDegrees!


    @IBOutlet var lonLabel: UILabel
    @IBOutlet var latLabel: UILabel

    @IBAction func nowButton(sender: AnyObject) {
        //現在地取得
        lm.startUpdatingLocation()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        var url = NSURL(scheme: "http", host: "xxxxxxx.herokuapp.com", path: "/1.0/users")
        var request = NSURLRequest(URL: url)
        var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)
        var json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableLeaves, error: nil) as NSDictionary

        for (key, value) in json {
            println()
        }

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


        lm = CLLocationManager()
        lm.delegate = self
        //位置情報取得の可否。バックグラウンドで実行中の場合にもアプリが位置情報を利用することを許可する
        lm.requestAlwaysAuthorization()
        //位置情報の精度
        lm.desiredAccuracy = kCLLocationAccuracyBest
        //位置情報取得間隔(m)
        lm.distanceFilter = 300
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    /** 位置情報取得成功時 */
    func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!){
        longitude = newLocation.coordinate.logitude
        latitude = newLocation.coordinate.latitude

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

        /** 位置情報取得失敗時 */
    func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
        NSLog("Error")
    }

}


これだけでいけると思っていたんですが、iOS8からだと、info.plistに以下のkeyが存在しないとlocationManagerメソッドが呼ばれないようです。

<key>NSLocationWhenInUseUsageDescription</key>
<string>The spirit of stack overflow is coders helping coders</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>I have learned more on stack overflow than anything else</string>

参考:
http://stackoverflow.com/questions/24062509/ios-8-location-services-not-working

Stack Overflow様々ですm(_ _)m