定期的に位置情報を更新する（CoreLocation::CLLocationManager）

# 定期的に位置情報を更新する

## UI要素の用意

Label * 2（緯度・経度用）
Button * 2（開始・終了用）
をストーリーボードに配置し、Outlet作成

```swift:ViewController.swift
class ViewController: UIViewController {

    @IBOutlet weak var latitudeLabel: UILabel!
    @IBOutlet weak var longitudeLabel: UILabel!
    @IBOutlet weak var startButton: UIButton!
    @IBOutlet weak var stopButton: UIButton!
```

## 位置情報利用準備

Info.plistのRequired device capabilitiesにlocation-servicesとgps追加
Info.plistのInformation Property ListにNSLocationAlwaysUsageDescriptionを追加して、許可を求めるダイアログに表示する文字列を設定
ViewController.swiftを編集

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

class ViewController: UIViewController, CLLocationManagerDelegate {
    
    var myLocationManager: CLLocationManager!
/*
        （中略）
*/
        super.viewDidLoad()
        
        let status = CLLocationManager.authorizationStatus()
        if status == CLAuthorizationStatus.Restricted || status == CLAuthorizationStatus.Denied {
            return
        }

        myLocationManager = CLLocationManager()
        myLocationManager.delegate = self

        if status == CLAuthorizationStatus.NotDetermined {
            myLocationManager.requestAlwaysAuthorization()
        }
        
        if !CLLocationManager.locationServicesEnabled() {
            return
        }
```

詳しくは[現在地の緯度・経度表示](http://qiita.com/shngt/items/258a71a6524941efd12d)参照

## 標準位置情報サービス開始

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

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

> 標準位置情報サービスの測地精度は、道案内アプリケーション、または測地精度の高い位置情報データもしくはストリームの定期的な更新が必要なアプリケーションで必要です。このサービスは通常、位置情報追跡ハードウェアを長時間にわたって有効にする必要があり、電力の使用量が高くなることがあります。

スタートボタンのアクション作成

```swift:ViewController.swift
        myLocationManager.distanceFilter = 100
    }

    @IBAction func onClickStartButton(sender: UIButton) {
        myLocationManager.startUpdatingLocation()
    }
```

ストップボタンのアクション作成

```swift:ViewController.swift
        myLocationManager.startUpdatingLocation()
    }
    
    @IBAction func onClickStopButton(sender: UIButton) {
        myLocationManager.stopUpdatingLocation()
    }
```

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

```swift:ViewController.swift
        myLocationManager.stopUpdatingLocation()
    }
    
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let lastLocation = locations.last
        if let last = lastLocation {
            let eventDate = last.timestamp
            if abs(eventDate.timeIntervalSinceNow) < 15.0 {
                if let location = manager.location {
                    latitudeLabel.text = "緯度：\(location.coordinate.latitude)"
                    longitudeLabel.text = "経度：\(location.coordinate.longitude)"
                }
            }
        }
    }
```

> 位置情報マネージャオブジェクトは、キャッシュされているイベントを返すことがあるため、受け取った位置情報イベントのタイムスタンプを確認することを推奨します（大まかな位置を取得するまで数秒を要する場合があります。したがって、古いデータは、最後に取得した位置を表す手段としてのみ役立ちます）。この例に示すメソッドは、この時間内のイベントであれば十分に有効であるという想定のもと、15秒以上が経過しているイベントをすべて破棄します。道案内アプリケーションを実装している場合は、このしきい値を下げる必要があるかもしれません。

> 位置情報オブジェクトのタイムスタンプのほか、イベントを受け取るかどうかを判断するために、オブジェクトから報告された精度を使用することもできます。位置情報サービスは、より正確なデータを受け取ると、その精度の向上を反映した精度値を持つ追加イベントを返します。精度の低いイベントを破棄するということは、アプリケーションが、効果的に使用できないイベントに浪費する時間を減らせるということです。

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

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

### 位置情報サービス起動タイミング

> 位置情報サービスを利用するアプリケーションであっても、実際に必要になるまでは、サービスを起動しないでください。いくつか例外はありますが、アプリケーションの起動後直ちに、あるいは位置情報サービスを利用するべき状況になる前に、このサービスを起動してはなりません。位置データを何のために使うのだろう、という疑念をユーザーに抱かせる恐れがあるからです。アプリケーションが位置情報サービスを起動すれば、システムは実行してよいか確認するプロンプトを出すので、ユーザはその旨を認識することになります。そこで、本当にこのサービスを要する作業が始まってから起動するようにすれば、適切な使い方になっている、という信頼感を与えることができるでしょう。

## 参考

[位置情報とマッププログラミングガイド](https://developer.apple.com/jp/documentation/LocationAwarenessPG.pdf)
[CLLocationManager Class Reference](https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/index.html#//apple_ref/doc/uid/TP40007125)