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

195

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

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

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

Awais Hussain
источник

Ответы:

226

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

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

Annu
источник
60
Не забывайте о Import MapKit+ CoreLocation+ добавлении CLLocationManagerDelegateв определении класса.
Lukesivi
7
@Yusha Если для вас это выглядит как Objective-C, значит, вы никогда не видели Objective-C (и не Swift)
Мартин Маркончини,
4
Вы забыли упомянуть реализацию протокола CLLocationManagerDelegate.
ssd352
13
NSLocationAlwaysUsageDescriptionбыл переименован вPrivacy - Location Always Usage Description
Сауд Ризван
4
Вы ДОЛЖНЫ объявить locationManagerглобальную переменную вместо локальной переменной вviewDidLoad
chengsam
100

Вы должны сделать эти шаги:

  1. Добавить CoreLocation.framework в BuildPhases -> связать двоичные файлы с библиотеками (больше не требуется с XCode 7.2.1)
  2. импортировать CoreLocationв свой класс - скорее всего ViewController.swift
  3. добавить CLLocationManagerDelegateк вашему объявлению класса
  4. добавить NSLocationWhenInUseUsageDescriptionи NSLocationAlwaysUsageDescriptionк PLIST
  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)")
    }
itzhar
источник
3
новая функция: func locationManager (менеджер: CLLocationManager, didUpdateLocations location: [CLLocation])
user523234
Пошаговый ответ. Но, пожалуйста, обновите его. Это не работает на данный момент.
Dheeraj D
60

Обновление для 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)
    }
}

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

скриншот карты в центре Мумбаи

swiftBoy
источник
Я запускаю ваш код и получаю пустой белый экран. Есть ли представление или что-то, что мне нужно добавить в раскадровку?
ThisClark
1
Отлично работал для меня в Swift 4, просто нужно было добавить подчеркивание (подсказанное Xcode), чтобы строка locationManager стала: func locationManager (_ manager: CLLocationManager, didUpdateLocations location: [CLLocation])
Элайджа Лофгрен,
32

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

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

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

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

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

Мистер Джавед Мултани
источник
у меня есть другой язык, тогда он не работает. Я хочу только английский язык.
Маулик шах
29

@wonderwhy Я добавил свой скриншот кода.  пожалуйста, проверьте это.  Вам нужно будет добавить <code> NSLocationWhenInUseUsageDescription в список для авторизации. </ Code>

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

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

Annu
источник
1
Вы можете объяснить свой ответ, добавив code.if, если хотите
Крутарт Патель
16
было бы неплохо иметь фрагмент кода с использованием языка разметки, а не вставлять скриншот
Николас Аллио
25

Первый импорт 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()

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

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

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

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)

    }
}
MiladiuM
источник
20

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 и включите «Конфиденциальность-Расположение, когда используется описание использования».

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

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

сначала добавьте две рамки в ваш проект

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

ScottyBlades
источник
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 )

Тек Радж
источник
8

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

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

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


Не забудьте добавить «NSLocationWhenInUseUsageDescription» в список info.plist.

Renetik
источник
1
Спасибо! Не забудьте добавить «NSLocationWhenInUseUsageDescription» в info.plist
Джонас Дейхельманн
3
import Foundation
import CoreLocation

enum Result<T> {
  case success(T)
  case failure(Error)
}

final class LocationService: NSObject {
private let manager: CLLocationManager

init(manager: CLLocationManager = .init()) {
    self.manager = manager
    super.init()
    manager.delegate = self
}

var newLocation: ((Result<CLLocation>) -> Void)?
var didChangeStatus: ((Bool) -> Void)?

var status: CLAuthorizationStatus {
    return CLLocationManager.authorizationStatus()
}

func requestLocationAuthorization() {
    manager.delegate = self
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.requestWhenInUseAuthorization()
    if CLLocationManager.locationServicesEnabled() {
        manager.startUpdatingLocation()
        //locationManager.startUpdatingHeading()
    }
}

func getLocation() {
    manager.requestLocation()
}

deinit {
    manager.stopUpdatingLocation()
}

}

 extension LocationService: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    newLocation?(.failure(error))
    manager.stopUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let location = locations.sorted(by: {$0.timestamp > $1.timestamp}).first {
        newLocation?(.success(location))
    }
      manager.stopUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    switch status {
    case .notDetermined, .restricted, .denied:
        didChangeStatus?(false)
    default:
        didChangeStatus?(true)
    }
}
}

Необходимо написать этот код в необходимом ViewController.

 //NOTE:: Add permission in info.plist::: NSLocationWhenInUseUsageDescription


let locationService = LocationService()

 @IBAction func action_AllowButtonTapped(_ sender: Any) {
  didTapAllow()
 }

 func didTapAllow() {
   locationService.requestLocationAuthorization()
 }

 func getCurrentLocationCoordinates(){
   locationService.newLocation = {result in
     switch result {
      case .success(let location):
      print(location.coordinate.latitude, location.coordinate.longitude)
      case .failure(let error):
      assertionFailure("Error getting the users location \(error)")
   }
  }
}

    func getCurrentLocationCoordinates(){
    locationService.newLocation = {result in
        switch result {
        case .success(let location):
            print(location.coordinate.latitude, location.coordinate.longitude)
            CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in
                if error != nil {
                    print("Reverse geocoder failed with error" + (error?.localizedDescription)!)
                    return
                }
                if (placemarks?.count)! > 0 {
                    print("placemarks", placemarks!)
                    let pmark = placemarks?[0]
                    self.displayLocationInfo(pmark)
                } else {
                    print("Problem with the data received from geocoder")
                }
            })
        case .failure(let error):
            assertionFailure("Error getting the users location \(error)")
        }
    }
}
Маннам Брахман
источник
0

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

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)")
    }
}
Эрик Стивенсон
источник
-1
// 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)
Ramanaraynan
источник
-1

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

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

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

Саджад Пармар
источник