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