位置情報から今の自分のいる場所をマップで表示するコード書いた

  
    
[簡単な地図をMapViewで表示するコード](http://qiita.com/tacksman/items/84e7e492d90e37a3e9f1)
こっちで書いてたやつからの発展。
  
  目標はこんな感じ
  1. 一回だけ自分の位置を取得する
  2. 取得した位置情報を元に地図を表示
  
  
  そしてできあがったソースがこちら。
  
```swift:ViewController.swift
    var locationManager: CLLocationManager?

    override func viewDidLoad() {
        super.viewDidLoad()
        
        locationManager = CLLocationManager()
        
        if (locationManager != NSNull()) {
            locationManager?.delegate = self
        
            locationManager?.requestAlwaysAuthorization()
            
            
            let status = CLLocationManager.authorizationStatus()
            switch status{
            case .Restricted, .Denied:
                break
            case .NotDetermined:
                // iOS8での位置情報追跡リクエストの方法
                if ((locationManager?.respondsToSelector("requestWhenInUseAuthorization")) != nil){
                    locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
                    locationManager?.requestWhenInUseAuthorization()
                    locationManager?.startUpdatingLocation()
                }else{
                    locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
                    locationManager?.startUpdatingLocation()
                }
            case .AuthorizedWhenInUse, .AuthorizedAlways:
                // 従来の位置情報追跡リクエストの方法
                locationManager?.startUpdatingLocation()
            default:
                break
            }
        }
    }
    
    override func viewWillAppear(animated: Bool) {
        locationManager?.startUpdatingLocation()
    }
    
    

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

    func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
        
        let latitude = newLocation.coordinate.latitude
        let longitude = newLocation.coordinate.longitude
        let location = CLLocationCoordinate2DMake(latitude,longitude)
        
        mkMapView.setCenterCoordinate(location, animated: true)
        
        var region: MKCoordinateRegion = mkMapView.region
        region.center = location
        region.span.latitudeDelta = 0.02
        region.span.longitudeDelta = 0.02
        
        let pointAnnotation: MKPointAnnotation = MKPointAnnotation()
        
        pointAnnotation.coordinate = location
        pointAnnotation.title = "現在地"
        
        mkMapView.addAnnotation(pointAnnotation)
        mkMapView.setRegion(region, animated: true)
        
        //地図の形式
        mkMapView.mapType = MKMapType.Standard
        locationManager?.stopUpdatingLocation()
    }
    
    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    }
```
  ----------------
    
      
このままだと男料理すぎるので、少し細かく刻んでいきます。
  
    
  ```swift:位置情報取得認証
  // 位置情報取得確認のメッセージを表示。必須。      
  locationManager?.requestAlwaysAuthorization()
            
            
  let status = CLLocationManager.authorizationStatus()
    // 位置情報取得の認証状態で分岐
    switch status{
      case .Restricted, .Denied:
           break
    case .NotDetermined:
         if ((locationManager?.respondsToSelector("requestWhenInUseAuthorization")) != nil){
            // iOS8ではinfo.plistに"requestWhenInUseAuthorization"か、"requestAlwaysAuthorization"を記載しないといけない
            // requestWhenInUseAuthorization:起動中のみ使用、requestAlwaysAuthorization:いつでも使用できる。
            
            // 精度の指定
            locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
            locationManager?.requestWhenInUseAuthorization()
            // 位置情報取得の開始
            locationManager?.startUpdatingLocation()
         }else{
              locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
              locationManager?.startUpdatingLocation()
         }
    case .AuthorizedWhenInUse, .AuthorizedAlways:
         // 従来の位置情報追跡リクエストの方法
         locationManager?.startUpdatingLocation()
    default:
         break
    }
  ```
  
この部分のコードで、位置情報取得のためのAuthorizationと位置情報の取得開始ができる。
  
そして、以下の部分が位置情報取得開始後の処理にあたる。
  
  ```swift:
  // 位置情報を取得したときに呼ばれる。Androidでのコールバックかも。
  func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
        // 取得した位置情報の緯度経度
        let latitude = newLocation.coordinate.latitude
        let longitude = newLocation.coordinate.longitude
        let location = CLLocationCoordinate2DMake(latitude,longitude)
        
        // 表示するマップの中心を、取得した位置情報のポイントに指定
        mkMapView.setCenterCoordinate(location, animated: true)
        
        // 表示する領域を設定する
        var region: MKCoordinateRegion = mkMapView.region
        // 領域設定の中心
        region.center = location
        // 表示する領域の拡大・縮小の係数
        region.span.latitudeDelta = 0.02
        region.span.longitudeDelta = 0.02
        
        // ピンのオブジェクトを生成
        let pointAnnotation: MKPointAnnotation = MKPointAnnotation()
        
        // ピンの位置を取得した位置情報の位置に設定
        pointAnnotation.coordinate = location
        // ピンをタップした際に表示される吹き出しの内容
        pointAnnotation.title = "現在地"
        
        // 設定したピンをマップ上に反映
        mkMapView.addAnnotation(pointAnnotation)
        // 決定した表示設定をMapViewに適用
        mkMapView.setRegion(region, animated: true)
        
        // 地図の形式。Standardがデフォルトの地図。Satteliteが航空地図。
        mkMapView.mapType = MKMapType.Standard
        // 位置情報は既に取得したので、これ以降取得を行わないように位置情報取得を停止
        locationManager?.stopUpdatingLocation()
    }
    
    // 位置情報取得が失敗した際に呼ばれる。
    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    }
  ```
  
  とりあえずこんな形。自分の位置にピンを立てるとかを忘れたので、次はそれを追加したりする予定。