Uzyskaj bieżącą lokalizację / współrzędne użytkownika

194

Jak mogę zapisać aktualną lokalizację użytkownika, a także pokazać lokalizację na mapie?

Jestem w stanie pokazać wstępnie zdefiniowane współrzędne na mapie, po prostu nie wiem, jak odbierać informacje z urządzenia.

Wiem też, że muszę dodać kilka przedmiotów do Plista. Jak mogę to zrobić?

Awais Hussain
źródło

Odpowiedzi:

225

Aby uzyskać bieżącą lokalizację użytkownika, musisz zadeklarować:

let locationManager = CLLocationManager()

W viewDidLoad()musisz utworzyć instancję CLLocationManagerklasy, tak:

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

Następnie w metodzie CLLocationManagerDelegate można uzyskać współrzędne bieżącej lokalizacji użytkownika:

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

W info.plist będziesz musiał dodać NSLocationAlwaysUsageDescription i swój niestandardowy komunikat ostrzegawczy jak; AppName (aplikacja demonstracyjna) chce użyć Twojej bieżącej lokalizacji.

Annu
źródło
60
Nie zapomnij o dodaniu Import MapKit+ CoreLocation+ CLLocationManagerDelegatew definicji klasy.
Lukesivi,
7
@Yusha Jeśli dla Ciebie wygląda to na Cel C, to nigdy nie widziałeś Celu C (ani Szybkiego)
Martin Marconcini
4
Zapomniałeś wspomnieć o implementacji protokołu CLLocationManagerDelegate.
ssd352,
13
NSLocationAlwaysUsageDescriptionprzemianowano naPrivacy - Location Always Usage Description
Saoud Rizwan
4
MUSISZ zadeklarować locationManagerjako zmienną globalną zamiast zmiennej lokalnej wviewDidLoad
chengsam
100

powinieneś wykonać następujące kroki:

  1. Dodaj CoreLocation.framework do BuildPhases -> Połącz plik binarny z bibliotekami (nie jest już wymagany od XCode 7.2.1)
  2. zaimportuj CoreLocationdo swojej klasy - najprawdopodobniej ViewController.swift
  3. dodaj CLLocationManagerDelegatedo deklaracji klasowej
  4. dodaj NSLocationWhenInUseUsageDescriptioni NSLocationAlwaysUsageDescriptiondo listy
  5. menedżer lokalizacji init:

    locationManager = CLLocationManager()
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
    locationManager.startUpdatingLocation()
  6. Uzyskaj lokalizację użytkownika przez:

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let locValue:CLLocationCoordinate2D = manager.location!.coordinate
        print("locations = \(locValue.latitude) \(locValue.longitude)")
    }
itzhar
źródło
3
nowa funkcja: func locationManager (manager: CLLocationManager, didUpdateLocations lokalizacje: [CLLocation])
user523234
Odpowiedź krok po kroku. Ale proszę zaktualizuj to. Na razie nie działa.
Dheeraj D
59

Aktualizacja dla iOS 12.2 z Swift 5

musisz dodać następujące uprawnienia prywatności w pliku plist

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

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

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

Oto jaka jestem

uzyskiwanie aktualnej lokalizacji i pokazywanie na mapie w Swift 2.0

Upewnij się, że dodałeś framework CoreLocation i MapKit do swojego projektu (nie jest to wymagane w 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)
    }
}

Oto ekran wyników

zrzut ekranu mapy wyśrodkowanej w Bombaju

swiftBoy
źródło
Uruchomiłem twój kod i pojawia się pusty biały ekran. Czy jest jakiś widok lub coś, co muszę dodać do scenorysu?
ThisClark
1
Świetnie działało dla mnie w Swift 4, wystarczyło dodać podkreślenie (monit Xcode), więc linia locationManager stała się: func locationManager (_ manager: CLLocationManager, didUpdateLocations lokalizacje: [CLLocation])
Elijah Lofgren
32

Importuj bibliotekę:

import CoreLocation

ustaw Deleguj:

CLLocationManagerDelegate

Weź zmienną jak:

var locationManager:CLLocationManager!

Na viewDidLoad () napisz ten ładny kod:

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

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

Napisz metody delegowania 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)")
}

Teraz ustaw uprawnienia dostępu do lokalizacji, więc dodaj te kluczowe wartości do pliku 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>

wprowadź opis zdjęcia tutaj

100% działa bez problemu. PRZETESTOWANY

Mr.Javed Multani
źródło
Mam inny język, więc to nie działa. Chcę tylko języka angielskiego.
Maulik shah
29

@wonderwhy Dodałem zrzut ekranu kodu.  proszę sprawdzić.  Będziesz musiał dodać <code> NSLocationWhenInUseUsageDescription do listy autoryzacji. </code>

NSLocationWhenInUseUsageDescription = Poproś o pozwolenie na korzystanie z usługi lokalizacji, gdy aplikacje są w tle. w pliku plist.

Jeśli to zadziała, proszę głosować na odpowiedź.

Annu
źródło
1
możesz wyjaśnić swoją odpowiedź, dodając kod. jeśli chcesz
Krutarth Patel
16
fajnie byłoby mieć fragment kodu za pomocą języka znaczników, a nie wklejać zrzut ekranu
Nicholas Allio,
25

Najpierw zaimportuj bibliotekę Corelocation i MapKit:

import MapKit
import CoreLocation

odziedziczymy po CLLocationManagerDelegate do naszej klasy

class ViewController: UIViewController, CLLocationManagerDelegate

utwórz zmienną locationManager, będą to twoje dane lokalizacji

var locationManager = CLLocationManager()

utwórz funkcję, aby uzyskać informacje o lokalizacji, bądź konkretny, działa ta dokładna składnia:

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

w swojej funkcji utwórz stałą dla bieżącej lokalizacji użytkownika

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

przestań aktualizować lokalizację, zapobiegnie to ciągłej zmianie okna przez urządzenie w celu wyśrodkowania lokalizacji podczas przenoszenia (możesz to pominąć, jeśli chcesz, aby działało inaczej)

manager.stopUpdatingLocation()

uzyskaj koordynację użytkowników od właśnie zdefiniowanego użytkownika

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

określ stopień powiększenia mapy:

let span = MKCoordinateSpanMake(0.2,0.2) połącz te dwa, aby uzyskać region:

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

teraz ustaw region i wybierz, czy chcesz iść tam z animacją, czy nie

mapView.setRegion(region, animated: true)

zamknij swoją funkcję }

za pomocą przycisku lub w inny sposób, aby ustawić locationManagerDeleget na siebie

teraz zezwól na wyświetlanie lokalizacji

wyznaczyć dokładność

locationManager.desiredAccuracy = kCLLocationAccuracyBest

autoryzować:

 locationManager.requestWhenInUseAuthorization()

aby móc autoryzować usługę lokalizacji, musisz dodać te dwa wiersze do swojej listy

wprowadź opis zdjęcia tutaj

uzyskaj lokalizację:

locationManager.startUpdatingLocation()

pokaż to użytkownikowi:

mapView.showsUserLocation = true

To jest mój pełny kod:

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
źródło
20

Swift 3.0

Jeśli nie chcesz pokazywać lokalizacji użytkownika na mapie, ale po prostu chcesz ją zapisać w bazie ogniowej lub w innym miejscu, wykonaj następujące kroki,

import MapKit
import CoreLocation

Teraz użyj CLLocationManagerDelegate na swoim VC i musisz przesłonić trzy ostatnie metody pokazane poniżej. Możesz zobaczyć, w jaki sposób metoda requestLocation () uzyska bieżącą lokalizację użytkownika za pomocą tych metod.

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

}

Teraz możesz zakodować poniższe połączenie, gdy użytkownik zaloguje się w Twojej aplikacji. Po wywołaniu metody requestLocation () będzie ona wywoływała funkcję didUpdateLocations powyżej i możesz zapisać lokalizację w Firebase lub w dowolnym innym miejscu.

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

jeśli korzystasz z GeoFire, w powyższej metodzie didUpdateLocations możesz zapisać lokalizację jak poniżej

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. 

Last but not least, przejdź do swojej Info.plist i włącz „Prywatność - lokalizacja, gdy jest w użyciu opis użytkowania”.

Kiedy używasz symulatora do testowania, zawsze dajesz jedną niestandardową lokalizację skonfigurowaną w Symulatorze -> Debuguj -> Lokalizacja.

Lyju I Edwinson
źródło
Cześć, Gdzie są lokalizacje (długość, szerokość geograficzna), Jak często ładują lokalizacje?
Cristian Mora
@CristianMora, gdy wywoływane jest locationManager.requestLocation, jest to wywoływane locationManager (_ manager: CLLocationManager, didUpdateLocations lokalizacje: [CLLocation]), gdzie jest to tablica Lokalizacje i możesz użyć jednego z nich lub pokazać użytkownikowi wybór najbardziej odpowiedniego. lokalizacje są typu CLLocation i możesz uzyskać długość geograficzną i szerokość geograficzną z tego obiektu.Jeśli potrzebujesz informacji o użytkowniku tylko raz, nie musisz ponownie ładować lokalizacji, w przeciwnym razie możesz wywołać requestLocation () w razie potrzeby. Przykład zapytania wyszukiwania, najpierw wywołujesz requestLocation (), a następnie na podstawie lokalizacji dajesz odpowiedzi.
Lyju I Edwinson
15

najpierw dodaj dwie struktury w swoim projekcie

1: MapKit

2: Corelokalizacja (nie jest już wymagana od XCode 7.2.1)

Zdefiniuj w swojej klasie

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

następnie w metodzie viewDidLoad kod to

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

//Setup our Map View
mapobj.showsUserLocation = true

nie zapomnij dodać tych dwóch wartości do pliku plist

1: NSLocationWhenInUseUsageDescription

2: NSLocationAlwaysUsageDescription
Krutarth Patel
źródło
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)")
    }
}

Ponieważ wywołanie do requestWhenInUseAuthorizationjest asynchroniczne, aplikacja wywołuje locationManagerfunkcję po tym, jak użytkownik udzieli uprawnienia lub je odrzuci. Dlatego właściwe jest umieszczenie Twojej lokalizacji, aby uzyskać kod wewnątrz tej funkcji, biorąc pod uwagę uprawnienia użytkownika. To najlepszy samouczek na ten temat, jaki na nim znalazłem .

ScottyBlades
źródło
10
 override func viewDidLoad() {

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

Jest to metoda załadowania widoku i do klasy ViewController należy również metoda aktualizacji mapStart w następujący sposób

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

Również nie zapomnij dodać CoreLocation.FrameWork i MapKit.Framework w projekcie (nie jest już konieczne, ponieważ z XCode 7.2.1 )

Tek Raj
źródło
6

Stosowanie:

Zdefiniuj pole w klasie

let getLocation = GetLocation()

Użycie w funkcji klasy przez prosty kod:

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

Klasa:

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


Nie zapomnij dodać „NSLocationWhenInUseUsageDescription” do info.plist.

Renetik
źródło
1
Dzięki! Nie zapomnij dodać „NSLocationWhenInUseUsageDescription” w info.plist
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)
    }
}
}

Musi napisać ten kod w wymaganym 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)")
        }
    }
}
Mannam Brahmam
źródło
0

oto przykład kopiuj-wklej, który zadziałał dla mnie.

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)")
    }
}
Eric Stevenson
źródło
-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)
Ramanarajnan
źródło
-1

100% pracuje w iOS Swift 4 przez: Parmar Sajjad

Krok 1: Przejdź do konsoli Api GoogleDeveloper i utwórz swój ApiKey

Krok 2: Zainstaluj projekt Goto Project Cocoapods GoogleMaps pod

krok 3: Goto AppDelegate.swift zaimportuj GoogleMaps i

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

    GMSServices.provideAPIKey("ApiKey")
    return true
}

krok 4: importuj UIKit importuj klasę 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)

}

}

krok 5: otwórz plik info.plist i dodaj poniżej Prywatność - lokalizacja w trakcie użytkowania Opis użycia ...... poniżej głównej nazwy głównego pliku scenorysu

krok 6: uruchom

Sajjad Parmar
źródło