Получить текущее местоположение пользователя/координаты

Как я могу сохранить текущее местоположение пользователя, а также показать местоположение на карте?

Я могу показать предопределенные координаты на карте, я просто не знаю, как получать информацию с устройства.

Также я знаю, что мне нужно добавить некоторые предметы в Plist. Как я могу это сделать?

Ответ 1

Чтобы получить текущее местоположение пользователя, вам необходимо объявить:

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) хочет использовать ваше текущее местоположение.

Ответ 2

вы должны сделать следующие шаги:

  1. добавьте CoreLocation.framework в BuildPhases → Ссылка на двоичные файлы с библиотеками (больше не требуется с XCode 7.2.1)
  2. импортируйте CoreLocation в свой класс - скорее всего ViewController.swift
  3. Добавить CLLocationManagerDelegate в объявление класса
  4. Добавить NSLocationWhenInUseUsageDescription и NSLocationAlwaysUsageDescription to NSLocationAlwaysUsageDescription
  5. менеджер местоположения init:

    locationManager = CLLocationManager()
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
    locationManager.startUpdatingLocation()
    
  6. get User Location By:

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

Ответ 3

Обновление для 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 Framework в свой проект (в 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

Ответ 4

@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.

Если это работает, пожалуйста, проголосуйте за ответ.

Ответ 5

Сначала импортируйте библиотеку 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) объедините эти два, чтобы получить область:

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 самостоятельно

теперь разрешить отображение местоположения

обозначает точность

locationManager.desiredAccuracy = kCLLocationAccuracyBest

авторизированный:

 locationManager.requestWhenInUseAuthorization()

, чтобы авторизовать службу определения местоположения, вам нужно добавить эти две строки в ваш plist

введите описание изображения здесь

получить местоположение:

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)

    }
}

Ответ 6

Импортировать библиотеку, например:

import CoreLocation

set Делегат:

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

 <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% работает без каких-либо проблем. ПРОВЕРЕНО

Ответ 7

Swift 3.0

Если вы не хотите показывать местоположение пользователя на карте, а просто хотите сохранить его в firebase или где-то еще, выполните следующие действия:

import MapKit
import CoreLocation

Теперь используйте CLLocationManagerDelegate на вашем VC, и вы должны переопределить последние три метода, показанные ниже. Вы можете увидеть, как метод 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 и включите "Privacy -Location, когда в описании использования использования".

Когда вы используете симулятор для тестирования, он всегда дает вам одно настраиваемое местоположение, настроенное вами в Simulator → Debug → Location.

Ответ 8

сначала добавьте две структуры в свой проект

1: MapKit

2: Corelocation (больше не требуется с 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

1: NSLocationWhenInUseUsageDescription

2: NSLocationAlwaysUsageDescription

Ответ 9

 override func viewDidLoad() {

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

Это ваш метод загрузки, и в классе 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

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 после того, как пользователь предоставил разрешение или отклонил его. Поэтому правильно разместить ваше местоположение, получая код внутри этой функции, если пользователь предоставил разрешение. Это лучший учебник по этому вопросу, который я нашел на нем.

Ответ 11

Использование:

Определить поле в классе

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

Ответ 12

Вот пример копирования-вставки, который работал для меня.

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

Ответ 13

// 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)

Ответ 14

100% работает в iOS Swift 4 от: Пармар Саджад

Шаг 1. Перейти к консоли разработчика Google Api и создать свой ApiKey

Шаг 2: Перейти к проекту установить Cocoapods pod 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: беги

Ответ 15

Вам не нужно делать много вещей, просто добавьте эти две строки, и вы сможете показывать текущее местоположение пользователя на карте, когда пользователь нажимает кнопку (у вас будет кнопка show currnt location в качестве дополнительного преимущества:) )

mapView.myLocationEnabled = true
mapView.settings.myLocationButton = true