Ottieni posizione / coordinate correnti dell'utente


194

Come posso memorizzare la posizione corrente dell'utente e anche mostrare la posizione su una mappa?

Sono in grado di mostrare coordinate predefinite su una mappa, ma non so come ricevere informazioni dal dispositivo.

Inoltre so che devo aggiungere alcuni elementi in un Plist. Come lo posso fare?

Risposte:


226

Per ottenere la posizione corrente di un utente è necessario dichiarare:

let locationManager = CLLocationManager()

In viewDidLoad()devi istanziare la CLLocationManagerclasse, in questo modo:

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

Quindi nel metodo CLLocationManagerDelegate è possibile ottenere le coordinate della posizione corrente dell'utente:

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

Nella info.plist dovrai aggiungere NSLocationAlwaysUsageDescription e come il tuo messaggio di avviso personalizzato; AppName (App Demo) vorrebbe utilizzare la posizione corrente.


60
Non dimenticare di aggiungere Import MapKit+ CoreLocation+ CLLocationManagerDelegatenella definizione della classe.
Lukesivi,

7
@Yusha Se ti sembra Objective-C, allora non hai mai visto Objective-C (né Swift)
Martin Marconcini il

4
Hai dimenticato di menzionare l'implementazione del protocollo CLLocationManagerDelegate.
ssd352,

13
NSLocationAlwaysUsageDescriptionè stato rinominato inPrivacy - Location Always Usage Description
Saoud Rizwan il

4
DEVI dichiarare locationManagercome variabile globale anziché come variabile locale inviewDidLoad
chengsam il

100

dovresti fare questi passaggi:

  1. aggiungi CoreLocation.frameworka BuildPhases -> Link Binary With Libraries (non più necessario da XCode 7.2.1)
  2. importare CoreLocationnella tua classe, molto probabilmente ViewController.swift
  3. aggiungi CLLocationManagerDelegatealla tua dichiarazione di classe
  4. aggiungere NSLocationWhenInUseUsageDescriptione NSLocationAlwaysUsageDescriptionplist
  5. init location manager:

    locationManager = CLLocationManager()
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
    locationManager.startUpdatingLocation()
    
  6. ottenere la posizione dell'utente di:

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

3
nuova funzione: func locationManager (gestore: CLLocationManager, posizioni didUpdateLocations: [CLLocation])
user523234

Risposta passo dopo passo. Ma per favore aggiornalo. Per ora non funziona.
Dheeraj D,

60

Aggiornamento per iOS 12.2 con Swift 5

è necessario aggiungere le seguenti autorizzazioni di privacy nel file plist

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

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

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

Ecco come sono

ottenere la posizione corrente e mostrarla sulla mappa in Swift 2.0

Assicurati di aver aggiunto CoreLocation e il framework MapKit al tuo progetto (questo non è necessario con 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)
    }
}

Ecco la schermata dei risultati

uno screenshot della mappa, centrato a Mumbai


Eseguo il tuo codice e ottengo una schermata bianca vuota. C'è una vista o qualcosa che devo aggiungere allo storyboard?
ThisClark,

1
Ha funzionato perfettamente per me in Swift 4, dovevo solo aggiungere un carattere di sottolineatura (richiesto da Xcode) in modo che la riga locationManager diventasse: func locationManager (_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
Elijah Lofgren

32

Importa libreria come:

import CoreLocation

impostare delegato:

CLLocationManagerDelegate

Prendi variabile come:

var locationManager:CLLocationManager!

On viewDidLoad () scrivi questo grazioso codice:

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

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

Scrivi metodi delegato 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)")
}

Ora imposta l'autorizzazione per accedere alla posizione, quindi aggiungi questi valori chiave nel tuo file 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>

inserisci qui la descrizione dell'immagine

100% funzionante senza problemi. ZERO


ho un'altra lingua, quindi non funziona. voglio solo la lingua inglese.
Maulik shah

29

@wonderwhy Ho aggiunto il mio screenshot del codice.  per favore controllalo.  Dovrai aggiungere <code> NSLocationWhenInUseUsageDescription nella lista per l'autorizzazione. </code>

NSLocationWhenInUseUsageDescription = Richiedi l'autorizzazione per utilizzare il servizio di localizzazione quando le app sono in background. nel tuo file plist.

Se funziona, vota la risposta.


1
puoi spiegare di più la tua risposta aggiungendo il codice. se lo desideri
Krutarth Patel,

16
sarebbe bello avere lo snippet di codice usando il linguaggio di markup piuttosto che incollare uno screenshot
Nicholas Allio,

25

Prima libreria di importazione Corelocation e MapKit:

import MapKit
import CoreLocation

ereditare da CLLocationManagerDelegate alla nostra classe

class ViewController: UIViewController, CLLocationManagerDelegate

crea una variabile locationManager, questi saranno i tuoi dati sulla posizione

var locationManager = CLLocationManager()

crea una funzione per ottenere le informazioni sulla posizione, sii specifico che questa sintassi esatta funzioni:

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

nella tua funzione crea una costante per la posizione corrente degli utenti

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

interrompere l'aggiornamento della posizione, questo impedisce al dispositivo di modificare costantemente la finestra per centrare la posizione durante lo spostamento (è possibile ometterlo se si desidera che funzioni diversamente)

manager.stopUpdatingLocation()

ottenere le coordinate degli utenti da userLocatin appena definito:

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

definisce quanto ingrandito vuoi che sia la tua mappa:

let span = MKCoordinateSpanMake(0.2,0.2) combina questi due per ottenere la regione:

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

ora imposta la regione e scegli se vuoi che ci vada con l'animazione o no

mapView.setRegion(region, animated: true)

chiudi la tua funzione }

dal tuo pulsante o da un altro modo in cui desideri impostare locationManagerDeleget su sé stesso

ora consenti di mostrare la posizione

designare l'accuratezza

locationManager.desiredAccuracy = kCLLocationAccuracyBest

autorizzare:

 locationManager.requestWhenInUseAuthorization()

per poter autorizzare il servizio di localizzazione devi aggiungere queste due righe al tuo plist

inserisci qui la descrizione dell'immagine

ottenere posizione:

locationManager.startUpdatingLocation()

mostralo all'utente:

mapView.showsUserLocation = true

Questo è il mio codice completo:

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

Se non vuoi mostrare la posizione dell'utente sulla mappa, ma vuoi solo memorizzarla in firebase o in qualche altro posto, segui questi passaggi,

import MapKit
import CoreLocation

Ora usa CLLocationManagerDelegate sul tuo VC e devi scavalcare gli ultimi tre metodi mostrati di seguito. Puoi vedere come il metodo requestLocation () ti porterà alla posizione dell'utente corrente usando questi metodi.

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

}

Ora puoi codificare la chiamata seguente una volta che l'utente accede alla tua app. Quando viene richiesto requestLocation (), invocherà ulteriormente didUpdateLocations sopra e sarà possibile memorizzare la posizione su Firebase o in qualsiasi altro luogo.

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

se si utilizza GeoFire, nel metodo didUpdateLocations sopra riportato è possibile memorizzare la posizione come di seguito

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. 

Ultimo ma non meno importante, vai al tuo Info.plist e abilita "Posizione privacy-quando nella descrizione dell'uso d'uso".

Quando si utilizza il simulatore per testarlo, si ottiene sempre una posizione personalizzata configurata in Simulatore -> Debug -> Posizione.


Ciao, dove sono le posizioni (longitudine, latitudine), con che frequenza ricaricare le posizioni?
Cristian Mora,

@CristianMora quando viene richiamato locationManager.requestLocation, questo è invocato locationManager (_ manager: CLLocationManager, locations di didUpdateLocations: [CLLocation]) dove si tratta di un array Locations e puoi usarne uno o mostrare all'utente di scegliere quello più appropriato. posizioni è di tipo CLLocation e puoi ottenere latitudine longitudinale da questo oggetto. Se hai bisogno delle informazioni utente solo una volta, non hai bisogno di ricaricare posizioni altrimenti puoi chiamare requestLocation () secondo necessità. Esempio di una richiesta di ricerca, prima si chiama requestLocation () e poi in base alla posizione si danno le risposte.
Lyju I Edwinson,

15

prima aggiungi due framework nel tuo progetto

1: MapKit

2: Corelocation (non più necessario da XCode 7.2.1)

Definisci nella tua classe

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

quindi nel metodo viewDidLoad codifica questo

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

//Setup our Map View
mapobj.showsUserLocation = true

non dimenticare di aggiungere questi due valori nel file 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)")
    }
}

Poiché la chiamata a requestWhenInUseAuthorizationè asincrona, l'app chiama la locationManagerfunzione dopo che l'utente ha concesso l'autorizzazione o l'ha rifiutata. Pertanto è opportuno inserire la propria posizione ottenendo il codice all'interno di tale funzione, dato il permesso concesso all'utente. Questo è il miglior tutorial su questo che ho trovato su di esso .


10
 override func viewDidLoad() {

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

Questa è la tua vista ha caricato il metodo e nella classe ViewController include anche il metodo di aggiornamento mapStart come segue

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

Inoltre , non dimenticare di aggiungere CoreLocation.FrameWork e MapKit.Framework nel tuo progetto (non più necessario a partire da XCode 7.2.1 )


7

Uso:

Definire il campo in classe

let getLocation = GetLocation()

Utilizzare in funzione della classe con un semplice codice:

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

Classe:

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


Non dimenticare di aggiungere "NSLocationWhenInUseUsageDescription" nel file info.plist.


1
Grazie! Non dimenticare di aggiungere "NSLocationWhenInUseUsageDescription" nel 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)
    }
}
}

Deve scrivere questo codice nel ViewController richiesto.

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

ecco un esempio di copia-incolla che ha funzionato per me.

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% funzionante in iOS Swift 4 di: Parmar Sajjad

Passaggio 1: vai su GoogleDeveloper Api Console e crea il tuo ApiKey

Passaggio 2: Goto Project installa il pod GoogleMaps di Cocoapods

passaggio 3: vai a AppDelegate.swift importa GoogleMaps e

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

    GMSServices.provideAPIKey("ApiKey")
    return true
}

passaggio 4: importare UIKit importare la classe 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)

}

}

passaggio 5: apri il file info.plist e aggiungi sotto Privacy - Posizione in uso Descrizione d'uso ...... sotto un nome di base del file di storyboard principale

passaggio 6: eseguire

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.