Show Current Location and Update Location in MKMapView in Swift Show Current Location and Update Location in MKMapView in Swift ios ios

Show Current Location and Update Location in MKMapView in Swift


You have to override CLLocationManager.didUpdateLocations (part of CLLocationManagerDelegate) to get notified when the location manager retrieves the current location:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {    if let location = locations.last{        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)    }}

NOTE: If your target is iOS 8 or above, you must include the NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription key in your Info.plist to get the location services to work.


100% working, easy steps and tested

Import libraries:

import MapKitimport CoreLocation

set delegates:

CLLocationManagerDelegate,MKMapViewDelegate

Take variable:

let locationManager = CLLocationManager()

write this code on viewDidLoad():

self.locationManager.requestAlwaysAuthorization()    // For use in foreground    self.locationManager.requestWhenInUseAuthorization()    if CLLocationManager.locationServicesEnabled() {        locationManager.delegate = self        locationManager.desiredAccuracy = kCLLocationAccuracyBest        locationManager.startUpdatingLocation()    }    mapView.delegate = self    mapView.mapType = .standard    mapView.isZoomEnabled = true    mapView.isScrollEnabled = true    if let coor = mapView.userLocation.location?.coordinate{        mapView.setCenter(coor, animated: true)    }

Write delegate method for location:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {    let locValue:CLLocationCoordinate2D = manager.location!.coordinate    mapView.mapType = MKMapType.standard    let span = MKCoordinateSpanMake(0.05, 0.05)    let region = MKCoordinateRegion(center: locValue, span: span)    mapView.setRegion(region, animated: true)    let annotation = MKPointAnnotation()    annotation.coordinate = locValue    annotation.title = "Javed Multani"    annotation.subtitle = "current location"    mapView.addAnnotation(annotation)    //centerMap(locValue)}

Do not forgot to set permission in info.plist

<key>NSLocationWhenInUseUsageDescription</key><string>This application requires location services to work</string><key>NSLocationAlwaysUsageDescription</key><string>This application requires location services to work</string>

It's look like:

enter image description here


For swift 3 and XCode 8 I find this answer:

  • First, you need set privacy into info.plist. Insert string NSLocationWhenInUseUsageDescription with your description why you want get user location. For example, set string "For map in application".

  • Second, use this code example

    @IBOutlet weak var mapView: MKMapView!private var locationManager: CLLocationManager!private var currentLocation: CLLocation?override func viewDidLoad() {    super.viewDidLoad()    mapView.delegate = self    locationManager = CLLocationManager()    locationManager.delegate = self    locationManager.desiredAccuracy = kCLLocationAccuracyBest    // Check for Location Services    if CLLocationManager.locationServicesEnabled() {        locationManager.requestWhenInUseAuthorization()        locationManager.startUpdatingLocation()    }}// MARK - CLLocationManagerDelegatefunc locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {    defer { currentLocation = locations.last }    if currentLocation == nil {        // Zoom to user location        if let userLocation = locations.last {            let viewRegion = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 2000, 2000)            mapView.setRegion(viewRegion, animated: false)        }    }}
  • Third, set User Location flag in storyboard for mapView.