web-dev-qa-db-ja.com

ユーザーの現在位置/座標を取得

ユーザーの現在位置を保存し、その位置を地図に表示する方法を教えてください。

地図上に定義済みの座標を表示することはできますが、デバイスから情報を受け取る方法がわかりません。

また、私はいくつかの項目をPlistに追加しなければならないことを知っています。どうやってやるの?

168
Awais Hussain

ユーザーの現在位置を取得するには、次のように宣言する必要があります。

let locationManager = CLLocationManager()

viewDidLoad()では、CLLocationManagerクラスをインスタンス化する必要があります。

// Ask for Authorisation from the User.
self.locationManager.requestAlwaysAuthorization() 

// For use in foreground
self.locationManager.requestWhenInUseAuthorization()

if CLLocationManager.locationServicesEnabled() {
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    locationManager.startUpdatingLocation()
}

その後、CLLocationManagerDelegateメソッドで、ユーザーの現在の位置座標を取得できます。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
    print("locations = \(locValue.latitude) \(locValue.longitude)")
}

Info.plistにNSLocationAlwaysUsageDescriptionとあなたのカスタム警告メッセージを追加する必要があります。 AppName(Demo App)はあなたの現在の場所を使用したいと思います。

195
Annu

あなたはそれらのステップをするべきです:

  1. buildPhasesにCoreLocation.frameworkを追加 - >ライブラリとバイナリをリンク(XCode 7.2.1以降は不要)
  2. CoreLocationをあなたのクラスにインポートする - おそらくViewController.Swift
  3. クラス宣言にCLLocationManagerDelegateを追加する
  4. plistにNSLocationWhenInUseUsageDescriptionNSLocationAlwaysUsageDescriptionを追加する
  5. initロケーションマネージャ:

    locationManager = CLLocationManager()
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
    locationManager.startUpdatingLocation()
    
  6. ユーザーロケーションを取得します。

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let locValue:CLLocationCoordinate2D = manager.location!.coordinate
        print("locations = \(locValue.latitude) \(locValue.longitude)")
    }
    
95
itzhar

iOS 12.2 と一緒に更新 - Swift 5

plistファイルに次のプライバシー権限を追加する必要があります

<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>

これが私のやり方です

現在地を取得してSwift 2.0の地図に表示する

プロジェクトに CoreLocation および MapKit フレームワークを追加したことを確認してください(これはXCode 7.2.1では必要ありません)

import Foundation
import CoreLocation
import MapKit

class DiscoverViewController : UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var map: MKMapView!
    var locationManager: CLLocationManager!

    override func viewDidLoad()
    {
        super.viewDidLoad()

        if (CLLocationManager.locationServicesEnabled())
        {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestAlwaysAuthorization()
            locationManager.startUpdatingLocation()
        }
    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {

        let location = locations.last! as CLLocation

        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))

        self.map.setRegion(region, animated: true)
    }
}

これが結果画面です

a screenshot of the map, centered in Mumbai

38
swiftBoy

@wonderwhy I have added my code screenshot. pls check it. You will have to add <code>NSLocationWhenInUseUsageDescription in the plist for authorisation.</code>

NSLocationWhenInUseUsageDescription =アプリがバックグラウンドで実行されているときに位置情報サービスを使用する許可を要求します。あなたのplistファイルに。

これでうまくいくなら、答えを投票してください。

28
Annu

最初のCorelocationとMapKitライブラリをインポートします。

import MapKit
import CoreLocation

cLLocationManagerDelegateからクラスに継承する

class ViewController: UIViewController, CLLocationManagerDelegate

locationManager変数を作成します。これはあなたの位置データになります。

var locationManager = CLLocationManager()

位置情報を取得するための関数を作成します。具体的には、この正確な構文は機能します。

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

あなたの関数の中でユーザーの現在位置を表す定数を作成する

let userLocation:CLLocation = locations[0] as CLLocation // note that locations is same as the one in the function declaration  

位置の更新を停止すると、移動中に端末が常に位置を中央に移動することができなくなります(他の機能を使用する場合は省略できます)。

manager.stopUpdatingLocation()

今定義したuserLocatinからユーザーの座標を取得します。

let coordinations = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,longitude: userLocation.coordinate.longitude)

地図のズーム倍率を定義します。

let span = MKCoordinateSpanMake(0.2,0.2)は、この2つを組み合わせて地域を取得します。

let region = MKCoordinateRegion(center: coordinations, span: span)//this basically tells your map where to look and where from what distance

今度は地域を設定し、あなたがそれをアニメーションでそこに行くことを望むかどうかを選択してください

mapView.setRegion(region, animated: true)

関数を閉じます}

ボタンなどから、locationManagerDelegetをselfに設定します。

今すぐ場所が表示されるのを許可します。

精度を指定する

locationManager.desiredAccuracy = kCLLocationAccuracyBest

承認する:

 locationManager.requestWhenInUseAuthorization()

位置情報サービスを認証するには、この2行をplistに追加する必要があります

enter image description here

場所を取得:

locationManager.startUpdatingLocation()

ユーザーに見せてください。

mapView.showsUserLocation = true

これは私の完全なコードです:

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var mapView: MKMapView!

    var locationManager = CLLocationManager()


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

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


    @IBAction func locateMe(sender: UIBarButtonItem) {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()

        mapView.showsUserLocation = true

    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let userLocation:CLLocation = locations[0] as CLLocation

        manager.stopUpdatingLocation()

        let coordinations = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,longitude: userLocation.coordinate.longitude)
        let span = MKCoordinateSpanMake(0.2,0.2)
        let region = MKCoordinateRegion(center: coordinations, span: span)

        mapView.setRegion(region, animated: true)

    }
}
25
Milad Masoodi

ライブラリをインポートする:

import CoreLocation

デリゲートを設定します。

CLLocationManagerDelegate

次のように変数を取ります。

var locationManager:CLLocationManager!

ViewDidLoad()で、このきれいなコードを書きます。

 locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()

    if CLLocationManager.locationServicesEnabled(){
        locationManager.startUpdatingLocation()
    }

CLLocationデリゲートメソッドを書く:

    //MARK: - location delegate methods
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let userLocation :CLLocation = locations[0] as CLLocation

    print("user latitude = \(userLocation.coordinate.latitude)")
    print("user longitude = \(userLocation.coordinate.longitude)")

    self.labelLat.text = "\(userLocation.coordinate.latitude)"
    self.labelLongi.text = "\(userLocation.coordinate.longitude)"

    let geocoder = CLGeocoder()
    geocoder.reverseGeocodeLocation(userLocation) { (placemarks, error) in
        if (error != nil){
            print("error in reverseGeocode")
        }
        let placemark = placemarks! as [CLPlacemark]
        if placemark.count>0{
            let placemark = placemarks![0]
            print(placemark.locality!)
            print(placemark.administrativeArea!)
            print(placemark.country!)

            self.labelAdd.text = "\(placemark.locality!), \(placemark.administrativeArea!), \(placemark.country!)"
        }
    }

}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print("Error \(error)")
}

場所へのアクセス権を設定します。そのため、これらのキー値を info.plist fileに追加します。

 <key>NSLocationAlwaysUsageDescription</key>
<string>Will you allow this app to always know your location?</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>

enter image description here

100%問題なく動作しています。テスト済み

22

Swift 3.0

地図でユーザーの位置を表示したくないが、それをfirebaseまたは他の場所に保存したい場合は、次の手順に従います。

import MapKit
import CoreLocation

今すぐあなたのVCでCLLocationManagerDelegateを使ってください、そしてあなたは以下に示される最後の3つのメソッドをオーバーライドしなければなりません。これらのメソッドを使用して、requestLocation()メソッドがどのようにして現在のユーザーの所在地を取得するのかを確認できます。

class MyVc: UIViewController, CLLocationManagerDelegate {

  let locationManager = CLLocationManager()

 override func viewDidLoad() {
    super.viewDidLoad()

    isAuthorizedtoGetUserLocation()

    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    }
}

 //if we have no permission to access user location, then ask user for permission.
func isAuthorizedtoGetUserLocation() {

    if CLLocationManager.authorizationStatus() != .authorizedWhenInUse     {
        locationManager.requestWhenInUseAuthorization()
    }
}


//this method will be called each time when a user change his location access preference.
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedWhenInUse {
        print("User allowed us to access location")
        //do whatever init activities here.
    }
}


 //this method is called by the framework on         locationManager.requestLocation();
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("Did location updates is called")
    //store the user location here to firebase or somewhere 
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print("Did location updates is called but failed getting location \(error)")
}

}

ユーザーがアプリにサインインしたら、以下の呼び出しをコーディングできます。 requestLocation()が呼び出されると、上記のdidUpdateLocationsがさらに呼び出され、その場所をFirebaseまたは他の場所に保存できます。

if CLLocationManager.locationServicesEnabled() {
            locationManager.requestLocation();
 }

geoFireを使用している場合は、上記のdidUpdateLocationsメソッドで以下のように場所を保存できます。

geoFire?.setLocation(locations.first, forKey: uid) where uid is the user id who logged in to the app. I think you will know how to get UID based on your app sign in implementation. 

大事なことを言い忘れましたが、あなたのInfo.plistに行き、 "Use Usage Description"の時には、Privacy-Locationを有効にしてください。

シミュレータを使用してテストするときは、シミュレータ - >デバッグ - >場所で設定したカスタムの場所を常に1つ指定します。

20
Lyju I Edwinson

最初にプロジェクトに2つのフレームワークを追加します

1: MapKit

2: 共割り当て (XCode 7.2.1以降は不要)

クラスで定義する

var manager:CLLocationManager!
var myLocations: [CLLocation] = []

次にviewDidLoadメソッドのコードでこれを

manager = CLLocationManager()
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.requestAlwaysAuthorization()
manager.startUpdatingLocation()

//Setup our Map View
mapobj.showsUserLocation = true

plistファイルにこれら2つの値を追加することを忘れないでください

1: NSLocationWhenInUseUsageDescription

2: NSLocationAlwaysUsageDescription
14
Krutarth Patel
 override func viewDidLoad() {

    super.viewDidLoad()       
    locationManager.requestWhenInUseAuthorization();     
    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.startUpdatingLocation()
    }
    else{
        print("Location service disabled");
    }
  }

これはあなたのビューがloadメソッドを行ったことであり、ViewControllerクラスには次のようにmapStart更新メソッドも含まれています。

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    var locValue : CLLocationCoordinate2D = manager.location.coordinate;
    let span2 = MKCoordinateSpanMake(1, 1)    
    let long = locValue.longitude;
    let lat = locValue.latitude;
    print(long);
    print(lat);        
    let loadlocation = CLLocationCoordinate2D(
                    latitude: lat, longitude: long            

   )     

    mapView.centerCoordinate = loadlocation;
    locationManager.stopUpdatingLocation();
}

また、 あなたのプロジェクトにCoreLocation.FrameWorkとMapKit.Frameworkを追加することを忘れないでください XCode 7.2.1以降は不要になりました

10
Tek Raj
import CoreLocation
import UIKit

class ViewController: UIViewController, CLLocationManagerDelegate {

    var locationManager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
    } 

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if status != .authorizedWhenInUse {return}
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation()
        let locValue: CLLocationCoordinate2D = manager.location!.coordinate
        print("locations = \(locValue.latitude) \(locValue.longitude)")
    }
}

requestWhenInUseAuthorizationの呼び出しは非同期であるため、アプリケーションは、ユーザーが許可を与えた後、またはそれを拒否した後にlocationManager関数を呼び出します。そのため、ユーザーに許可が与えられている場合は、コードを取得する場所をその関数内に配置するのが適切です。 これは私が見つけたこれに関する最良のチュートリアルです

10
ScottyBlades

使用法:

クラス内のフィールドを定義

let getLocation = GetLocation()

簡単なコードでクラスの機能に使う:

getLocation.run {
    if let location = $0 {
        print("location = \(location.coordinate.latitude) \(location.coordinate.longitude)")
    } else {
        print("Get Location failed \(getLocation.didFailWithError)")
    }
}

クラス:

import CoreLocation

public class GetLocation: NSObject, CLLocationManagerDelegate {
    let manager = CLLocationManager()
    var locationCallback: ((CLLocation?) -> Void)!
    var locationServicesEnabled = false
    var didFailWithError: Error?

    public func run(callback: @escaping (CLLocation?) -> Void) {
        locationCallback = callback
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
        manager.requestWhenInUseAuthorization()
        locationServicesEnabled = CLLocationManager.locationServicesEnabled()
        if locationServicesEnabled { manager.startUpdatingLocation() }
        else { locationCallback(nil) }
    }

   public func locationManager(_ manager: CLLocationManager,
                         didUpdateLocations locations: [CLLocation]) {
        locationCallback(locations.last!)
        manager.stopUpdatingLocation()
    }

    public func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        didFailWithError = error
        locationCallback(nil)
        manager.stopUpdatingLocation()
    }

    deinit {
        manager.stopUpdatingLocation()
    }
}
3
Renetik
// its with strongboard 
@IBOutlet weak var mapView: MKMapView!

//12.9767415,77.6903967 - exact location latitude n longitude location 
let cooridinate = CLLocationCoordinate2D(latitude: 12.9767415 , longitude: 77.6903967)
let  spanDegree = MKCoordinateSpan(latitudeDelta: 0.2,longitudeDelta: 0.2)
let region = MKCoordinateRegion(center: cooridinate , span: spanDegree)
mapView.setRegion(region, animated: true)
0
Ramanaraynan

iOS Swift 4で100%作業している人:Parmar Sajjad

ステップ1:後藤GoogleDeveloper APIコンソールそしてあなたのApiKeyを作成しなさい

ステップ2:Goto ProjectがCocoapods GoogleMapsポッドをインストールする

ステップ3:AppDelegate.SwiftからGoogleMapsをインポートして

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    GMSServices.provideAPIKey("ApiKey")
    return true
}

ステップ4:UIKitをインポートするGoogleMapsクラスをインポートするViewController:UIViewController、CLLocationManagerDelegate {

@IBOutlet weak var mapview: UIView!
let locationManager  = CLLocationManager()

override func viewDidLoad() {
    super.viewDidLoad()
    locationManagerSetting()
    // Do any additional setup after loading the view, typically from a nib.
}

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


func locationManagerSetting() {

    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    self.showCurrentLocationonMap()
    self.locationManager.stopUpdatingLocation()
}
func showCurrentLocationonMap() {
    let
    cameraposition  = GMSCameraPosition.camera(withLatitude: (self.locationManager.location?.coordinate.latitude)!  , longitude: (self.locationManager.location?.coordinate.longitude)!, zoom: 18)
    let  mapviewposition = GMSMapView.map(withFrame: CGRect(x: 0, y: 0, width: self.mapview.frame.size.width, height: self.mapview.frame.size.height), camera: cameraposition)
    mapviewposition.settings.myLocationButton = true
    mapviewposition.isMyLocationEnabled = true

    let marker = GMSMarker()
    marker.position = cameraposition.target
    marker.snippet = "Macczeb Technologies"
    marker.appearAnimation = GMSMarkerAnimation.pop
    marker.map = mapviewposition
    self.mapview.addSubview(mapviewposition)

}

}

ステップ5:info.plistファイルを開き、下に追加プライバシー - 使用中の場所使用法の説明......メインストーリーボードファイルのベース名の下

ステップ6:実行

0
Sajjad Parmar

これが私のために働いたコピーペーストの例です。

http://swiftdeveloperblog.com/code-examples/determine-users-current-location-example-in-Swift/ /

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    var locationManager:CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

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

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        determineMyCurrentLocation()
    }


    func determineMyCurrentLocation() {
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestAlwaysAuthorization()

        if CLLocationManager.locationServicesEnabled() {
            locationManager.startUpdatingLocation()
            //locationManager.startUpdatingHeading()
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let userLocation:CLLocation = locations[0] as CLLocation

        // Call stopUpdatingLocation() to stop listening for location updates,
        // other wise this function will be called every time when user location changes.

       // manager.stopUpdatingLocation()

        print("user latitude = \(userLocation.coordinate.latitude)")
        print("user longitude = \(userLocation.coordinate.longitude)")
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error)
    {
        print("Error \(error)")
    }
}
0
Eric Stevenson