Current User Location
Un petit rappel pour indiquer la position de l'utilisateur sur la carte
1- Insérer une carte
Dans le ViewController du projet, ou dans le controller dédié pour la carte, importer MapKit,
Créer l'outlet reliant la carte au controller
import UIKit
import MapKit
class ViewController: UIViewController {
@IBOutlet weak var mapView: MKMapView!
}
Dans le storyboard, insérer une MapKit, lui donner des contraintes, et relier l'outlet.
Vous pouvez lancer l'application, une belle carte apparaît.
2- Donner la permission de Géolocalisation
Dans le fichier info.plist, ajouter "Privacy - Location When In Use Usage Description"
3- Manager pour gérer la localisation
Dans le ViewController, importer CoreLocation, créer un manager pour gérer la localisation, lui attribuer la délégation, et conformer la classe au protocole CLLocationManagerDelegate en extension
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController {
@IBOutlet weak var mapView: MKMapView!
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
}
}
extension ViewController: CLLocationManagerDelegate {
}
Utiliser le manager pour demander l'autorisation de géolocalisation (.requestWhenInUseAuthorization()), spécifier la précision de l'affichage de la zone de localisation (.desiredAccuracy), et commencer la mise à jour de la localisation en cas de mouvement (.startUpdatingLocation())
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
}
Une fonction setupManager() peut être dédiée aux propriétés du manager, et appelée dans le viewDidLoad()
Dans l'extension, nous appelons une fonction locationManager avec le paramètre didUpdateLocations du protocole. Dans cette fonction, se trouve un tableau des positions enregistrées ([CLLocation]). Dans notre exemple , nous voulons juste localiser l'utilisateur, nous prenons sa dernière position (locations.last), et arrêtons la mise à jour des positions (qui consomme de la batterie) (.stopUpdatingLocation())
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last {
locationManager.stopUpdatingLocation()
print(location)
}
}
4- Préciser la zone de localisation
Nous spécifions la zone de localisation dans une fonction configureRegion() qui aura en paramètre la localisation.
Définir la région avec la méthode .setRegion
func configureRegion( _ location: CLLocation) {
mapView.setRegion(region: MKCoordinateRegion, animated: Bool)
}
Nous avons besoin d'une région de type "MKCoordinateRegion" pour renseigner le paramètre "region".
Créons une propriété region qui sera de type MKCoordinateRegion. Nous l'initialisons avec les pramètres center et span
let region = MKCoordinateRegion(center: CLLocationCoordinate2D, span: MKCoordinateSpan)
De la même manière, le paramètre center est de type CLLocationCoordinate2D, et span de type MKCoordinateSpan.
Créons deux propriétés pour ces paramètres. Nous les initialisons avec leur unique méthode.
let center = CLLocationCoordinate2D(latitude: CLLocationDegrees, longitude: CLLocationDegrees)
let span = MKCoordinateSpan(latitudeDelta: CLLocationDegrees, longitudeDelta: CLLocationDegrees)
Dans la documention , le type pour ces paramètres est Double.
- span représente l'étendu de la zone,
- center la position de la zone donc la latitude et longitude de la localisation de l'utilisateur (location)
Nous pouvons maintenant compléter toutes les propriétés de la méthode.
Ajouter la propriété mapView.showsUserLocation
mapView.showsUserLocation = true
func configureRegion( _ location: CLLocation) {
let span = MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
let region = MKCoordinateRegion(center: center, span: span)
mapView.setRegion(region, animated: true)
mapView.showsUserLocation = true
}
Dans la méthode locationManager, remplacer le print par
configureRegion(location)
5- Ajouter une AnnotationView sur la carte
Pour ajouter une épingle, créer une instance de la class MKPointAnnotation()
let pin = MKPointAnnotation()
Lui attribuer des coordonnées, celles de l'utilisateur, utilisé pour le centre de la carte
pin.coordinate = center
Et l'ajouter sur la carte
mapView.addAnnotation(pin)
6- SIMULATEUR
Lorsque vous lancez le simulateur pour la première fois, donnez l'autorisation "Allow Once".
A chaque lancement, vous pouvez choisir la localisation dans Debug/Simulate Location avant la demande de localisation.
Modifier les valeurs du span pour avoir un affichage plus précis (0.005)
Le code final :
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController {
@IBOutlet weak var mapView: MKMapView!
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
setupManager()
}
func setupManager() {
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
}
}
extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last {
locationManager.stopUpdatingLocation()
configureRegion(location)
}
}
func configureRegion(_ location: CLLocation) {
let span = MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
let region = MKCoordinateRegion(center: center, span: span)
mapView.setRegion(region, animated: true)
mapView.showsUserLocation = true
let pin = MKPointAnnotation()
pin.coordinate = center
mapView.addAnnotation(pin)
}
}
bon code...