位置情報の表示
位置情報サービス利用許可取得
iOSアプリケーションを正しく機能させるために位置情報サービスが必要な場合は、アプリケーションのInfo.plistファイルにUIRequiredDeviceCapabilitiesキーを追加する必要があります。AppStoreは、このキーの情報を使用して、リストに含まれている機能のないデバイスへのアプリケーションのダウンロードを防ぎます。
UIRequiredDeviceCapabilitiesの値は、アプリケーションが必要とする機能を示す文字列の配列です。位置情報サービスに関連する文字列は2つあります。
● 一般的な位置情報サービスを必要とする場合は、文字列location-servicesを指定します。
● GPSハードウェアでしか得られない測地精度を必要とする場合は、文字列gpsを指定します。
Info.plistを開き、Required device capabilitiesの+ボタンを押してItemを2つ追加、Valueをlocation-servicesとgpsにする
iOSアプリケーションで位置情報サービスを利用するけれども、位置情報がなくても正常に動作する場合は、対応する文字列をUIRequiredDeviceCapabilitiesキーに指定しないでください。
表示用ラベル作成
- ストーリーボードにLabelを2つ配置(緯度用・経度用)
- ViewController.swiftにOutlet作成
class ViewController: UIViewController {
@IBOutlet weak var latitudeLabel: UILabel!
@IBOutlet weak var longitudeLabel: UILabel!
override func viewDidLoad() {
位置情報取得用ボタン作成
- ストーリーボードにButtonを配置
- ViewController.swiftにOutlet作成
class ViewController: UIViewController {
@IBOutlet weak var latitudeLabel: UILabel!
@IBOutlet weak var longitudeLabel: UILabel!
@IBOutlet weak var getLocationButton: UIButton!
override func viewDidLoad() {
CoreLocation読み込み
CoreLocationフレームワークのインポート
import UIKit
import CoreLocation
CLLocationManagerDelegateの宣言
Swiftでは複数クラスの継承はできないのでプロトコルを宣言する
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var latitudeLabel: UILabel!
@IBOutlet weak var longitudeLabel: UILabel!
CoreLocationManager用のプロパティを用意
class ViewController: UIViewController, CLLocationManagerDelegate {
var myLocationManager: CLLocationManager!
@IBOutlet weak var latitudeLabel: UILabel!
位置情報サービスの利用可否の確認
ユーザーが位置情報サービスを無効にしていたり、機内モードで必要なハードウェアの電源が入れられないなどの理由で位置情報が利用できないことがある。
この時に位置情報サービスを有効にすべきかどうか再度確認を求めると、ユーザーは煩わしく感じるので必ず位置情報サービス利用許可状況確認を行うようにとのこと。
super.viewDidLoad()
let status = CLLocationManager.authorizationStatus()
if status == CLAuthorizationStatus.Restricted || status == CLAuthorizationStatus.Denied {
return
}
CLLocationManagerオブジェクトのデリゲート
if status == CLAuthorizationStatus.Restricted || status == CLAuthorizationStatus.Denied {
return
}
myLocationManager = CLLocationManager()
myLocationManager.delegate = self
位置情報取得許可の確認
- Info.plistのInformation Property ListにNSLocationWhenInUseUsageDescriptionを追加して、許可を求めるダイアログに表示する文字列を設定
- まだ確認できていなければ、ダイアログ表示
- ユーザーが許可したか確認
myLocationManager.delegate = self
if status == CLAuthorizationStatus.NotDetermined {
myLocationManager.requestWhenInUseAuthorization()
}
if !CLLocationManager.locationServicesEnabled() {
return
}
標準位置情報サービス設定
位置情報取得精度と更新頻度を設定(いずれもDoubleのメートル)
if !CLLocationManager.locationServicesEnabled() {
return
}
myLocationManager.desiredAccuracy = kCLLocationAccuracyBest
myLocationManager.distanceFilter = kCLDistanceFilterNone
ボタンアクション作成
ボタンをタップすると現在地情報取得(iOS9.0以降)
@IBAction func onClickGetLocationButton(sender: UIButton) {
myLocationManager.requestLocation()
}
位置情報取得成功時の動作作成
myLocationManager.requestLocation()
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = manager.location {
latitudeLabel.text = "緯度:\(location.coordinate.latitude)"
longitudeLabel.text = "経度:\(location.coordinate.longitude)"
}
}
位置情報取得失敗時の動作作成
longitudeLabel.text = "経度:\(location.coordinate.longitude)"
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
print("error")
}
動作確認
シミュレータの場合はDebug->Locationから位置情報をセット
参考情報
現在の位置情報の取得 - 逆引きSwift(iOS編)
位置情報とマッププログラミングガイド
CLLocationManager Class Reference