13
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

現在地の緯度・経度表示(CoreLocation::CLLocationManager:requestLocation)

Last updated at Posted at 2016-04-08

位置情報の表示

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

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作成
ViewCotroller.swift
class ViewController: UIViewController {
    
    @IBOutlet weak var latitudeLabel: UILabel!
    @IBOutlet weak var longitudeLabel: UILabel!
    
    override func viewDidLoad() {

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

  1. ストーリーボードにButtonを配置
  2. ViewController.swiftにOutlet作成
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フレームワークのインポート

ViewController.swift
import UIKit
import CoreLocation

CLLocationManagerDelegateの宣言

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

ViewController.swift
import UIKit
import CoreLocation

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

CoreLocationManager用のプロパティを用意

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

    @IBOutlet weak var latitudeLabel: UILabel!

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

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

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

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

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

位置情報取得許可の確認

  1. Info.plistのInformation Property ListにNSLocationWhenInUseUsageDescriptionを追加して、許可を求めるダイアログに表示する文字列を設定
  2. まだ確認できていなければ、ダイアログ表示
  3. ユーザーが許可したか確認
ViewController.swift
        myLocationManager.delegate = self
        
        if status == CLAuthorizationStatus.NotDetermined {
            myLocationManager.requestWhenInUseAuthorization()
        }
        
        if !CLLocationManager.locationServicesEnabled() {
            return
        }

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

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

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

ボタンアクション作成

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

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

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

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)"
        }
    }

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

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

動作確認

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

参考情報

現在の位置情報の取得 - 逆引きSwift(iOS編)‎
位置情報とマッププログラミングガイド
CLLocationManager Class Reference

13
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?