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

143

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

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

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

Теги:
location
maps
user

12 ответов

162

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

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

  • 0
    Не могли бы вы положить это в рабочий пакет?
  • 0
    @wonderwhy, что вы подразумеваете под рабочим пакетом?
Показать ещё 14 комментариев
90

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

  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
    новая функция: func locationManager (менеджер: CLLocationManager, didUpdateLocations location: [CLLocation])
  • 0
    Пошаговый ответ. Но, пожалуйста, обновите его. Это не работает на данный момент.
31

Вот как я

получение текущего местоположения и отображение на карте в 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)
    }
}

Вот экран результатов

Изображение 1822

  • 0
    Я запускаю твой код и получаю пустой белый экран. Есть ли представление или что-то, что мне нужно добавить в раскадровку?
  • 0
    Отлично работал для меня в Swift 4, просто нужно было добавить подчеркивание (запрашиваемое XCode), чтобы строка locationManager стала: func locationManager (_ manager: CLLocationManager, didUpdateLocations location: [CLLocation])
28

Изображение 1823

NSLocationWhenInUseUsageDescription = Запросить разрешение на использование службы определения местоположения, когда приложения находятся в фоновом режиме. в вашем файле plist.

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

  • 1
    Вы можете объяснить свой ответ, добавив code.if вы хотите
  • 12
    было бы неплохо иметь фрагмент кода с использованием языка разметки, а не вставлять скриншот
23

Сначала импортируйте библиотеку 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

Изображение 1824

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

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)

    }
}
17

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.

  • 0
    Привет, Где находятся местоположения (долгота, широта), Как часто происходит перезагрузка местоположений?
  • 0
    @CristianMora, когда вызывается locationManager.requestLocation, вызывается locationManager (_ manager: CLLocationManager, didUpdateLocations location: [CLLocation]), где это массив Locations, и вы можете использовать один из них или показать пользователю, чтобы выбрать наиболее подходящий. location имеет тип CLLocation, и вы можете получить longitudd, latitude из этого объекта. Если вам нужна информация о пользователе только один раз, вам не нужно перезагружать местоположения, в противном случае вы можете вызвать requestLocation () по мере необходимости. В качестве примера поискового запроса вы сначала вызываете requestLocation (), а затем в зависимости от местоположения даете ответы.
13

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

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
11

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

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>

Изображение 1825

100% работает без каких-либо проблем. ПРОВЕРЕНО

  • 0
    у меня есть другой язык, тогда он не работает. Я хочу только английский язык.
10
 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)

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню