Avez-vous remarqué le nombre d’applications pouvant être réunies dans lesquelles nous sommes situés, indiquez des endroits intéressants proches, Mark itinéraires …? Dans cet article, je vais expliquer comment une application des cartes et des itinéraires est construite avec MapKit.
Mais qu’est-ce que mapkit? MapKit est un cadre Apple qui basse son fonctionnement sur les données de l’API et de la carte Apple, de sorte que les cartes puissent être facilement ajoutées aux applications développées, dans ce cas, pour iOS.
un peu de swift
Ce projet peut être trouvé complet dans github.
Conception d’interface
Ce projet comprendra essentiellement un composant MKAPView, qui nous montrera la carte, que nous allons ajouter Différents composants selon les fonctionnalités que nous souhaitons ajouter à l’application. De plus, dans ce projet, tout cela se fera via du code, sans utiliser de storyboards ou de fichiers .xib.
Création du projet
Pour travailler sans scénario lors de l’établissement d’un projet dans Xcode 11, nous devons prendre un projet Quelques étapes après l’avoir créée:
- Supprimons le fichier principal.storyboard.
- sur l’onglet Général, nous allons au sélecteur d’interface principal et supprimez-le, laissant le champ vide.
- Enfin, sur l’onglet Info, nous allons à l’application Scène Manifest > Configuration de la scène > Rôle de la session d’application > Item 0 (Configuration par défaut) et supprimez le champ Nom du storyboard.
Comme maintenant, nous n’appellerons pas la carte principale pour démarrer le projet, nous allons au fichier ScendineEgate.swift et dans la fonction Scène (_ Scène: UISCENE, Session WillConnectTo: UISCENESESSION, Options ConnexionOPTIONS: UISCENE. connectoptions) et remplacer son contenu par le code suivant:
guard let windowScene = (scene as? UIWindowScene) else { return }window = UIWindow(frame: UIScreen.main.bounds)let viewController = ViewController()window?.rootViewController = viewControllerwindow?.makeKeyAndVisible()window?.windowScene = windowScene
Ajouter une carte à notre
à Ajoutez une carte à l’écran, il suffit de créer une instance de MKMAPView et de l’ajouter à la vue d’écran. Pour ce faire, dans la classe ViewController, nous devons tout d’abord importer la bibliothèque Mapkit, puis nous créons une instance de MKMAPView et le présentez-la:
import UIKitimport MapKitclass ViewController: UIViewController { private let mapView = MKMapView(frame: .zero) override func viewDidLoad() { super.viewDidLoad() layoutUI() } private func layoutUI() { mapView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(mapView) NSLayoutConstraint.activate() }}
Si nous exécutons l’application, nous pouvons voir une carte approximative à l’écran de l’endroit où nous sommes localisés.
<
Pour nous montrer exactement, nous devons utiliser La classe CllouerManager, qui indique qu’Apple indique, vous permet de démarrer et de terminer l’envoi d’événements de localisation à notre application:
- détecte les modifications apportées à la position de l’utilisateur.
- Voir les modifications Dans l’adresse de la boussole.
- surveiller les régions d’intérêt.
- détecte la position des balises voisines.
autorisations
N’oubliez pas que pour utiliser les fonctions de localisation, avant de devoir demander la permission Nom d’utilisateur. Pour cela, nous ajoutons dans le fichier info.plist, une série de paramètres (comme je l’ai également montré à utiliser des notifications):
- Confidentialité – Emplacement Toujours et lors de l’utilisation Description d’utilisation
- Confidentialité – Emplacement Toisy Utilisation Description
- Confidentialité – Localisation Lors de l’utilisation Utilisation Description
Ce que nous donnons comme valeur le message que nous souhaitons montrer à l’utilisateur à demander Pour la permission (dans cet exemple, « Autoriser l’accès à l’emplacement afin d’utiliser cette application. »).
Une fois l’info fichier.plist, nous allons Pour effectuer la vérification de l’application, d’abord, si les services de localisation sont activés, puis, si l’année USUAR a donné une autorisation et quel type d’autorisation.Ce que nous faisons en premier lieu consiste à créer une instance de la classe CllouerManager:
private let locationManager = CLLocationManager()
et ensuite, nous créons la checkloctionervice méthode, dans celle que nous vérifierons si les services de localisation sont activés sur l’appareil et, dans l’affirmative, nous établirons le délégué (délégué) de cette classe comme indiqué dans la documentation et nous indiquerons avec quelle précision nous voulons travailler le Emplacement:
private func checkLocationServices() { guard CLLocationManager.locationServicesEnabled() else { // Here we must tell user how to turn on location on device return } locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest}
Cette fonction l’appellera à partir de la méthode ViewDidLoad. Bien que nous établissons le délégué, nous avons adopté quelques méthodes de ce délégué qui nous permettront de savoir si cela change d’autorisation donnée par l’utilisateur sur l’utilisation de l’emplacement (EmplacementManager (_: DidChangeAtorization :)) et lorsque l’emplacement de l’utilisateur (EmplacementManager (_: DidupdaTelocations :)) (Nous le faisons dans une extension de la classe ViewController pour avoir le code organisé):
Nous pouvons maintenant continuer à remplir la classe ViewController en ajoutant la méthode qui ressemblera si l’application a la permission et quel type d’autorisation utiliser l’emplacement. Dans cette méthode, ce que nous faisons, c’est appeler la méthode d’autorisationStatus de la classe CllouerManager et vérifier quelle valeur nous obtenons:
private func checkAuthorizationForLocation() { switch CLLocationManager.authorizationStatus() { case .authorizedWhenInUse, .authorizedAlways: mapView.showsUserLocation = true locationManager.startUpdatingLocation() break case .denied: // Here we must tell user how to turn on location on device break case .notDetermined: locationManager.requestWhenInUseAuthorization() case .restricted: // Here we must tell user that the app is not authorize to use location services break @unknown default: break }}
comme vous peut voir, il existe différentes possibilités concernant l’autorisation de l’utilisation de l’emplacement:
- AuthorisizeinUtilisée. L’utilisateur a autorisé l’application à démarrer les services d’emplacement lorsqu’il est utilisé.
- Autorisé. L’utilisateur a autorisé l’application à démarrer les services de localisation à tout moment.
- refusé. L’utilisateur a rejeté l’utilisation des services d’emplacement pour l’application ou est désactivée dans le monde entier dans les paramètres.
- Notdéterminé. L’utilisateur n’a pas choisi si l’application peut utiliser des services de localisation.
- restreint. L’application n’est pas autorisée à utiliser les services de localisation.
Cette fonction, checkauthorizeforlocation, nous l’appellerons à deux points:
- dans les services de checklocations () Après avoir établi le délégué, après avoir entré la demande.
- sur la méthode EmplacementManager (_: DidChangeAuthorization :), au cas où l’autorisation de l’utilisateur change lors de l’utilisation de l’application.
private func checkLocationServices() { guard CLLocationManager.locationServicesEnabled() else { // Here we must tell user how to turn on location on device return } locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest checkAuthorizationForLocation()}func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { checkAuthorizationForLocation()}
Si nous exécutons maintenant l’application, nous verrons comment il affiche une alerte demandant une autorisation d’utiliser des services de localisation.
Une fois que nous avons autorisé l’application à utiliser les services de localisation, ce que nous avons à faire est de vous dire que vous pouvez activer le suivi de la position de l’appareil. Pour ce faire, dans la méthode checkauthorizeforLocation () et dans les cas qui permettent une utilisation, nous ajoutons le code suivant:
case .authorizedWhenInUse, .authorizedAlways: mapView.showsUserLocation = true centerViewOnUser() locationManager.startUpdatingLocation() break
lo Que nous faisons ici, c’est dire que l’instance de mkmapview doit afficher la position de l’utilisateur (MapView.ShowsuserLocation = true), qui concentre la vue sur l’utilisateur (méthode que nous allons créer maintenant) et que la mise à jour de l’emplacement est activée.
Montrez notre position sur la carte
La méthode Centerviewonuer (), ce qu’elle est déterminée à partir de l’emplacement de l’utilisateur, l’établissement d’une région rectangulaire centrée est un point. Pour cela, nous utilisons mkcoordinateegion.
private let rangeInMeters: Double = 10000private func centerViewOnUser() { guard let location = locationManager.location?.coordinate else { return } let coordinateRegion = MKCoordinateRegion.init(center: location, latitudinalMeters: rangeInMeters, longitudinalMeters: rangeInMeters) mapView.setRegion(coordinateRegion, animated: true)}
ici, d’abord nous nous assurons d’avoir la position de l’utilisateur. Ensuite, nous établissons une région de 10 x 10 km concentrée sur l’utilisateur. Enfin, nous établissons cette région sur la carte. De cette façon, nous obtenons l’image suivante sur l’appareil.
Enfin, pour pouvoir activer la position de l’utilisateur sur la carte, dans la méthode EmplacementManager (_: DidupdaTelocations 🙂 Nous faisons quelque chose comme ce que nous avons fait pour centrer la vue L’utilisateur:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: ) { guard let location = locations.last else { return } let coordinateRegion = MKCoordinateRegion.init(center: location.coordinate, latitudinalMeters: rangeInMeters, longitudinalMeters: rangeInMeters) mapView.setRegion(coordinateRegion, animated: true)}
Mais dans ce cas, l’emplacement que nous obtenons de la dernière valeur de la liste des emplacements qui renvoie La méthode.
Sélectionnez le type de carte
La carte que nous voyons par défaut lorsque l’application est activée est le type standard. MapKit vous permet d’afficher différents types de cartes en modifiant la valeur du paramètre MapType de l’instance MkmapView:
- standard. Une carte des rues qui montre la position de toutes les routes et des noms de route.
- satellite. Images satellitaires de la zone.
- hybride. Une image satellite de la zone avec des informations sur les routes et le nom (dans une couche au-dessus de la carte).
- satelliteflyover.Une image satellite de la zone avec des données de la zone (où elles sont disponibles).
- hybridflyover. Une image satellite hybride avec des données de la zone (où elles sont disponibles).
- MuTanTandard. Une carte de rue où nos données sont surlignées sur les détails de la carte.
Dans ce cas, nous n’utiliserons que trois types de cartes: standard, satellite et hybride.
La sélection du type de carte que nous souhaitons afficher dans l’application Nous l’utiliserons à l’aide d’un bouton avec un menu déroulant, qui peut être téléchargé comme un package SWIFT (Fabbutton). Pour cela, nous suivons ces étapes:
- du menu Fichier Xcode > Swift Package > Ajouter Forfait Dépendance … Nous ajoutons le composant Fabbutton. L’URL est: https://github.com/raulferrerdev/FABButton.git
- Suivant, nous créons une instance de la et de sa configuration (les icônes utilisées sont déjà incluses dans le projet):
private let mapTypeButton = FABView(buttonImage: UIImage(named: "earth")override func viewDidLoad() { super.viewDidLoad() ... configureMapTypeButton() ...} private func configureMapTypeButton() { mapTypeButton.delegate = self mapTypeButton.addSecondaryButtonWith(image: UIImage(named: "map")!, labelTitle: "Standard", action: { self.mapView.mapType = .mutedStandard }) mapTypeButton.addSecondaryButtonWith(image: UIImage(named: "satellite")!, labelTitle: "Satellite", action: { self.mapView.mapType = .satellite }) mapTypeButton.addSecondaryButtonWith(image: UIImage(named: "hybrid")!, labelTitle: "Hybrid", action: { self.mapView.mapType = .hybrid }) mapTypeButton.setFABButton()}
- Comme vous pouvez le constater, nous avons établi le délégué pour le type FABVIEW, nous devons donc faire le Classe ViewController est conforme à ce protocole. Pour que nous ajoutons l’extension suivante au projet:
- enfin, dans la méthode LayoutUI Nous ajoutons le bouton à la vue et indiquons votre message:
Si nous exécutons la demande, nous pouvons Vérifiez que nous pouvons changer de type de carte:
- de ces deux valeurs, nous vérifions qu’aucune erreur n’a eu lieu et qui a renvoyé une position. Un objet Clapemark stocke des données faisant référence à certaines la latitude et la longitude (telles que, par exemple, le pays, l’État, la ville et la direction de la rue, des points d’intérêt et des données géographiquement associées).
- de ces informations nous intéressons à deux paramètres: la voie de circulation (qui est l’adresse de rue associée à la position indiquée) et à la sous-thorhoroughfare (qui donne des informations supplémentaires sur cette adresse).
- enfin , et dans le fil principal, nous ajoutons ces informations à l’étiquette.