現在地の緯度・経度表示（CoreLocation::CLLocationManager:requestLocation）

# 位置情報の表示

## 位置情報サービス利用許可取得

> iOSアプリケーションを正しく機能させるために位置情報サービスが必要な場合は、アプリケーションのInfo.plistファイルにUIRequiredDeviceCapabilitiesキーを追加する必要があります。AppStoreは、このキーの情報を使用して、リストに含まれている機能のないデバイスへのアプリケーションのダウンロードを防ぎます。
>
> UIRequiredDeviceCapabilitiesの値は、アプリケーションが必要とする機能を示す文字列の配列です。位置情報サービスに関連する文字列は2つあります。
> ● 一般的な位置情報サービスを必要とする場合は、文字列location-servicesを指定します。
> ● GPSハードウェアでしか得られない測地精度を必要とする場合は、文字列gpsを指定します。

Info.plistを開き、Required device capabilitiesの+ボタンを押してItemを2つ追加、Valueをlocation-servicesとgpsにする

> **iOSアプリケーションで位置情報サービスを利用するけれども、位置情報がなくても正常に動作する場合は、対応する文字列をUIRequiredDeviceCapabilitiesキーに指定しないでください。**

## 表示用ラベル作成

1. ストーリーボードにLabelを2つ配置（緯度用・経度用)
2. ViewController.swiftにOutlet作成

```swift:ViewCotroller.swift
class ViewController: UIViewController {
    
    @IBOutlet weak var latitudeLabel: UILabel!
    @IBOutlet weak var longitudeLabel: UILabel!
    
    override func viewDidLoad() {
```

## 位置情報取得用ボタン作成

1. ストーリーボードにButtonを配置
2. ViewController.swiftにOutlet作成

```swift:ViewCotroller.swift
class ViewController: UIViewController {
    
    @IBOutlet weak var latitudeLabel: UILabel!
    @IBOutlet weak var longitudeLabel: UILabel!
    @IBOutlet weak var getLocationButton: UIButton!
    
    override func viewDidLoad() {
```

## CoreLocation読み込み

CoreLocationフレームワークのインポート

```swift:ViewController.swift
import UIKit
import CoreLocation
```

## CLLocationManagerDelegateの宣言
Swiftでは複数クラスの継承はできないのでプロトコルを宣言する

```swift:ViewController.swift
import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {
    
    @IBOutlet weak var latitudeLabel: UILabel!
    @IBOutlet weak var longitudeLabel: UILabel!

```

## CoreLocationManager用のプロパティを用意

```swift:ViewController.swift
class ViewController: UIViewController, CLLocationManagerDelegate {
    
    var myLocationManager: CLLocationManager!

    @IBOutlet weak var latitudeLabel: UILabel!
```

## 位置情報サービスの利用可否の確認

ユーザーが位置情報サービスを無効にしていたり、機内モードで必要なハードウェアの電源が入れられないなどの理由で位置情報が利用できないことがある。
この時に位置情報サービスを有効にすべきかどうか再度確認を求めると、ユーザーは煩わしく感じるので必ず位置情報サービス利用許可状況確認を行うようにとのこと。

```swift:ViewController.swift
        super.viewDidLoad()
        
        let status = CLLocationManager.authorizationStatus()
        if status == CLAuthorizationStatus.Restricted || status == CLAuthorizationStatus.Denied {
            return
        }
```

## CLLocationManagerオブジェクトのデリゲート

```swift:ViewController.swift
        if status == CLAuthorizationStatus.Restricted || status == CLAuthorizationStatus.Denied {
            return
        }
        
        myLocationManager = CLLocationManager()
        myLocationManager.delegate = self
```

## 位置情報取得許可の確認

1. Info.plistのInformation Property ListにNSLocationWhenInUseUsageDescriptionを追加して、許可を求めるダイアログに表示する文字列を設定
2. まだ確認できていなければ、ダイアログ表示
3. ユーザーが許可したか確認

```swift:ViewController.swift
        myLocationManager.delegate = self
        
        if status == CLAuthorizationStatus.NotDetermined {
            myLocationManager.requestWhenInUseAuthorization()
        }
        
        if !CLLocationManager.locationServicesEnabled() {
            return
        }
```

## 標準位置情報サービス設定

位置情報取得精度と更新頻度を設定(いずれもDoubleのメートル)

```swift:ViewController.swift
        if !CLLocationManager.locationServicesEnabled() {
            return
        }
        
        myLocationManager.desiredAccuracy = kCLLocationAccuracyBest
        myLocationManager.distanceFilter = kCLDistanceFilterNone
```

## ボタンアクション作成

ボタンをタップすると現在地情報取得(iOS9.0以降)

```swift:ViewController.swift
    @IBAction func onClickGetLocationButton(sender: UIButton) {
        myLocationManager.requestLocation()
    }
```

位置情報取得成功時の動作作成

```swift:ViewController.swift
        myLocationManager.requestLocation()
    }
    
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = manager.location {
            latitudeLabel.text = "緯度：\(location.coordinate.latitude)"
            longitudeLabel.text = "経度：\(location.coordinate.longitude)"
        }
    }
```

位置情報取得失敗時の動作作成

```swift:ViewController.swift
        longitudeLabel.text = "経度：\(location.coordinate.longitude)"
    }
    
    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        print("error")
    }
```

## 動作確認

シミュレータの場合はDebug->Locationから位置情報をセット

## 参考情報

[現在の位置情報の取得 - 逆引きSwift(iOS編)‎](https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/06-corelocation/001-xian-zai-wei-zhino-qu-de)
[位置情報とマッププログラミングガイド](https://developer.apple.com/jp/documentation/LocationAwarenessPG.pdf)
[CLLocationManager Class Reference](https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/)