Отримайте поточне місцезнаходження / координати користувача


194

Як я можу зберігати поточне місцезнаходження користувача, а також показувати його на карті?

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

Також я знаю, що я повинен додати деякі елементи до списку. Як я можу це зробити?

Відповіді:


225

Щоб отримати поточне місцезнаходження користувача, потрібно задекларувати:

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 (демо-додаток) хотів би використовувати ваше поточне місцеположення.


60
Не забувайте про Import MapKit+ CoreLocation+ додавання CLLocationManagerDelegateу визначенні класу.
Lukesivi

7
@Yusha Якщо вам це схоже на Objective-C, ви ніколи не бачили Objective-C (ні Swift)
Martin Marconcini

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до плісту
  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)")
    }

3
нова функція: func locationManager (менеджер: CLLocationManager, didUpdateLocations locations: [CLLocation])
користувач523234

Покрокова відповідь. Але оновіть його, будь ласка. Наразі це не працює.
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 до свого проекту (Це не потрібно для 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)
    }
}

Ось екран результатів

скріншот карти з центром у Мумбаї


Я запускаю ваш код і отримую порожній білий екран. Чи є перегляд або щось, що мені потрібно додати до розкадрівки?
ThisClark

1
Для мене чудово працював у Swift 4, просто довелося додати підкреслення (підказку Xcode), щоб рядок locationManager став: func locationManager (_ менеджер: 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 Я додав скріншот свого коду.  pls перевірити це.  Вам доведеться додати <code> NSLocationWhenInUseUsageDescription в плейстист для авторизації. </code>

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

Якщо це працює, будь ласка, проголосуйте відповідь.


1
ви можете пояснити свою відповідь детальніше, додавши code.якщо хочете
Krutarth Patel

16
було б непогано мати фрагмент коду, використовуючи мову розмітки, а не вставляючи скріншот
Nicholas Allio

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

отримати координати користувачів від користувачаLocatin, який ви тільки що визначили:

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)

закрийте свою функцію }

за допомогою вашої кнопки чи іншим способом ви хочете встановити розташуванняManagerDeleget для самозабезпечення

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

позначити точність

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)

    }
}

20

Swift 3.0

Якщо ви не хочете показувати місцезнаходження користувача на карті, а просто хочете зберегти його в Firebase або де-небудь ще, виконайте ці кроки,

import MapKit
import CoreLocation

Тепер використовуйте CLLocationManagerDelegate на своєму ВК, і ви повинні перекрити останні три способи, показані нижче. Ви можете бачити, як метод 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 (_ менеджер: CLLocationManager, didUpdateLocations location: [CLLocation]), де це масив Locations, і ви можете використовувати один з них або показати користувачеві, щоб вибрати найбільш підходящий. місця розташування типу CLLocation, і ви можете отримати поздовжнє, широту від цього об'єкта. Якщо вам потрібна інформація про користувача лише один раз, тоді вам не потрібно буде перезавантажувати місця, інакше ви можете зателефонувати на requestLocation () за потребою. Приклавши запит на пошук, спочатку ви викликаєте requestLocation (), а потім на основі місцезнаходження дайте відповіді.
Lyju I Edwinson

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функцію після надання дозволу або відхилення користувача. Тому правильно розміщувати своє місцезнаходження, отримуючи код всередині цієї функції, надаючи користувачеві дозвіл. Це найкращий підручник з цього питання, який я знайшов на ньому .


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 )


7

Використання:

Визначте поле у ​​класі

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" в інформаційний список.


1
Дякую! Не забудьте додати "NSLocationWhenInUseUsageDescription" в інформаційний список
Jonas Deichelmann

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

-1

На 100% працює в iOS Swift 4 автор: Parmar Sajjad

Крок 1: Перейдіть на консоль Api GoogleDeveloper та створіть свій ApiKey

Крок 2: Встановіть Goto Project, встановіть Cocoapods GoogleMaps pod

крок 3: імпорт Goto 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: запустіть

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.