Utilisez ce guide pour permettre à votre application d'écouter et de répondre à divers événements qui changent au fur et à mesure qu'un utilisateur parcourt un itinéraire. Ce guide ne traite pas de la définition d'un itinéraire, mais uniquement des réponses aux événements qui se produisent le long d'un itinéraire.
Présentation
Le SDK Navigation pour iOS fournit des écouteurs associés à la position de l'utilisateur et aux conditions sur l'itinéraire, ainsi qu'à des données de durée et de distance importantes. Sur le contrôleur de vue de la carte, votre application doit adopter les protocoles pour ces écouteurs : GMSRoadSnappedLocationProviderListener
et GMSNavigatorListener
.
Cette liste présente les méthodes d'écouteur disponibles pour les événements de navigation:
GMSNavigatorListener.didArriveAtWaypoint
, déclenché lorsqu'une destination est atteinte.GMSNavigatorListener.navigatorDidChangeRoute
, déclenché lorsque la route change.GMSNavigatorListener.didUpdateRemainingTime
, appelé à plusieurs reprises lorsque le temps de trajet vers la destination suivante change, alors que le guidage est actif.GMSNavigatorListener.didUpdateRemainingDistance
, appelé à plusieurs reprises lorsque la distance jusqu'à la prochaine destination change, alors que le guidage est actif.GMSNavigatorListener.didUpdateDelayCategory
, appelé lorsque la catégorie de retard jusqu'à la destination suivante change, lorsque le guidage est actif.GMSNavigatorListener.didChangeSuggestedLightingMode
, déclenché lorsque les conditions d'éclairage estimées sont mises à jour. Par exemple, l'éclairage change lorsque la nuit tombe à l'emplacement actuel de l'utilisateur.GMSNavigatorListener.didUpdateSpeedingPercentage
, déclenché lorsque le conducteur dépasse la limite de vitesse.GMSRoadSnappedLocationProviderListener.didUpdateLocation
, appelé à plusieurs reprises lorsque l'emplacement de l'utilisateur change.
Voir le code
Déclaration de conformité aux protocoles requis
Avant d'implémenter les méthodes de navigation, le contrôleur de vue doit adopter les protocoles suivants:
Swift
class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {
Objective-C
@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>
@end
Après avoir adopté les protocoles de navigation, définissez les écouteurs sur le contrôleur de vue. Par exemple, vous pouvez ajouter le code suivant à la méthode viewDidLoad()
.
Swift
mapView.navigator?.add(self) mapView.roadSnappedLocationProvider?.add(self)
Objective-C
[_mapView.navigator addListener:self]; [_mapView.roadSnappedLocationProvider
addListener:self];
Réception ou arrêt des notifications de position
Les mises à jour de la position sont nécessaires pour afficher la progression de l'utilisateur sur la carte.
L'instance location
expose les propriétés suivantes:
Propriété de l'emplacement | Description |
---|---|
altitude | Altitude actuelle. |
coordinate.latitude | Coordonnée de latitude actuelle avec écartement de la route. |
coordinate.longitude | Coordonnée de longitude actuelle avec écartement de la route. |
cours | Orientation actuelle en degrés. |
speed | Vitesse actuelle. |
timestamp | Date et heure de la mesure actuelle. |
Pour recevoir des notifications de position en continu, appelez mapView.roadSnappedLocationProvider.startUpdatingLocation
et utilisez GMSRoadSnappedLocationProviderListener
pour gérer l'événement didUpdateLocation
.
L'exemple suivant vous montre comment appeler startUpdatingLocation
:
Swift
mapView.roadSnappedLocationProvider.startUpdatingLocation()
Objective-C
[_mapView.roadSnappedLocationProvider startUpdatingLocation];
Le code suivant crée un GMSRoadSnappedLocationProviderListener
qui gère l'événement didUpdateLocation
.
Swift
func locationProvider(_ locationProvider: GMSRoadSnappedLocationProvider,
didUpdate location: CLLocation) { print("Location: \(location.description)") }
Objective-C
- (void)locationProvider:(GMSRoadSnappedLocationProvider *)locationProvider
didUpdateLocation:(CLLocation *)location { NSLog(@"Location: %@",
location.description); }
Pour recevoir des notifications de position lorsque l'application est en arrière-plan, définissez allowsBackgroundLocationUpdates
sur "true" :
Swift
mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true
Objective-C
_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;
Détecter les événements d'arrivée
Votre application utilise l'événement didArriveAtWaypoint
pour détecter quand une destination a été atteinte. Pour reprendre le guidage et passer au point de cheminement suivant, appelez continueToNextDestination()
, puis réactivez le guidage. Votre application doit réactiver les conseils après avoir appelé continueToNextDestination()
.
Une fois que l'application a appelé continueToNextDestination
, le navigateur ne dispose plus de données sur la destination précédente. Si vous souhaitez analyser des informations sur une section d'itinéraire, vous devez les récupérer à partir du navigateur avant d'appeler continueToNextDestination()
.
L'exemple de code suivant montre une méthode permettant de gérer l'événement didArriveAtWaypoint
:
Swift
func navigator(_ navigator: GMSNavigator, didArriveAt waypoint:
GMSNavigationWaypoint) { print("You have arrived at: \(waypoint.title)")
mapView.navigator?.continueToNextDestination()
mapView.navigator?.isGuidanceActive = true }
Objective-C
- (void)navigator:(GMSNavigator *)navigator
didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint { NSLog(@"You have
arrived at: %@", waypoint.title); [_mapView.navigator
continueToNextDestination]; _mapView.navigator.guidanceActive = YES; }
Recevoir des notifications de modification de l'itinéraire
Pour recevoir une notification chaque fois que la route est modifiée, créez une méthode permettant de gérer l'événement navigatorDidChangeRoute
. Vous pouvez accéder à la nouvelle route à l'aide des propriétés routeLegs
et currentRouteLeg
de GMSNavigator
.
Swift
func navigatorDidChangeRoute(_ navigator: GMSNavigator) { print("The route has
changed.") }
Objective-C
- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator { NSLog(@"The route
has changed."); }
Recevoir des informations sur le délai avant destination
Pour recevoir des mises à jour continues du délai avant destination, créez une méthode permettant de gérer l'événement didUpdateRemainingTime
. Le paramètre time
fournit le temps estimé, en secondes, avant d'atteindre la destination suivante.
Swift
func navigator(_ navigator: GMSNavigator, didUpdateRemainingTime time:
TimeInterval) { print("Time to next destination: \(time)") }
Objective-C
- (void)navigator:(GMSNavigator *)navigator
didUpdateRemainingTime:(NSTimeInterval)time { NSLog(@"Time to next
destination: %f", time); }
Pour définir la variation minimale de l'heure estimée de la prochaine destination, définissez la propriété timeUpdateThreshold
sur GMSNavigator
. La valeur est spécifiée en secondes. Si cette propriété n'est pas définie, les services utilisent une valeur par défaut d'une seconde.
Swift
navigator?.timeUpdateThreshold = 10
Objective-C
navigator.timeUpdateThreshold = 10;
Recevoir des informations sur la distance jusqu'à la destination
Pour recevoir des mises à jour en continu de la distance jusqu'à la destination, créez une méthode permettant de gérer l'événement didUpdateRemainingDistance
. Le paramètre distance
indique la distance estimée, en mètres, jusqu'à la prochaine destination.
Swift
func navigator(_ navigator: GMSNavigator, didUpdateRemainingDistance distance:
CLLocationDistance) { let miles = distance * 0.00062137 print("Distance to next
destination: \(miles) miles.") }
Objective-C
- (void)navigator:(GMSNavigator *)navigator
didUpdateRemainingDistance:(CLLocationDistance)distance { double miles =
distance * 0.00062137; NSLog(@"%@", [NSString stringWithFormat:@"Distance to
next destination: %.2f.", miles]); }
Pour définir la variation minimale de la distance estimée jusqu'à la prochaine destination, définissez la propriété distanceUpdateThreshold
sur GMSNavigator
(la valeur est spécifiée en mètres). Si cette propriété n'est pas définie, les services utilisent une valeur par défaut d'un mètre.
Swift
navigator?.distanceUpdateThreshold = 100
Objective-C
navigator.distanceUpdateThreshold = 100;
Recevoir des informations sur le trafic
Pour recevoir des mises à jour continues du flux de trafic pour l'itinéraire restant, créez une méthode permettant de gérer l'événement didUpdateDelayCategory
. Un appel à delayCategoryToNextDestination
renvoie GMSNavigationDelayCategory
, qui fournit une valeur comprise entre 0 et 3. Les mises à jour de la catégorie sont basées sur la position actuelle de l'utilisateur de l'application. Si les données de trafic ne sont pas disponibles, GMSNavigationDelayCategory
renvoie 0. Les chiffres, 1 à 3, indiquent une
augmentation du flux, de léger à fort.
Swift
func navigator(_ navigator: GMSNavigator, didUpdate delayCategory:
GMSNavigationDelayCategory) { print("Traffic flow to next destination:
\(delayCategory)") }
Objective-C
- (void)navigator:(GMSNavigator *)navigator
didUpdateDelayCategory:(GMSNavigationDelayCategory)delayCategory {
NSLog(@"Traffic flow to next destination: %ld", (long)delayCategory); }
La propriété GMSNavigationDelayCategory
expose les niveaux de délai suivants:
Catégorie de retard | Description |
---|---|
GMSNavigationDelayCategoryNoData | 0 – Indisponible, aucune donnée sur le trafic ou : |
la route. | |
GMSNavigationDelayCategoryHeavy | 1 - Abondante. |
GMSNavigationDelayCategoryMedium | 2 - Moyen. |
GMSNavigationDelayCategoryLight | 3 – Léger. |
Recevoir des notifications sur l'excès de vitesse
Pour recevoir des notifications lorsqu'un conducteur dépasse la limitation de vitesse, créez une méthode permettant de gérer l'événement didUpdateSpeedingPercentage
.
Swift
// Listener to handle speeding events. func navigator( _ navigator:
GMSNavigator, didUpdateSpeedingPercentage percentageAboveLimit: CGFloat ) {
print("Speed is \(percentageAboveLimit) above the limit.") }
Objective-C
// Listener to handle speeding events. - (void)navigator:(GMSNavigator
*)navigator didUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit {
NSLog(@"Speed is %f percent above the limit.", percentageAboveLimit); }
Modifier le mode d'éclairage suggéré
Pour recevoir des informations sur les changements estimés de luminosité, créez une méthode permettant de gérer l'événement didChangeSuggestedLightingMode
.
Swift
// Define a listener for suggested changes to lighting mode. func navigator(_
navigator: GMSNavigator, didChangeSuggestedLightingMode lightingMode:
GMSNavigationLightingMode) { print("Suggested lighting mode has changed:
\(String(describing: lightingMode))")
// Make the suggested change. mapView.lightingMode = lightingMode }
Objective-C
// Define a listener for suggested changes to lighting mode.
-(void)navigator:(GMSNavigator *)navigator didChangeSuggestedLightingMode:
(GMSNavigationLightingMode)lightingMode { NSLog(@"Suggested lighting mode has
changed: %ld", (long)lightingMode);
// Make the suggested change. _mapView.lightingMode = lightingMode; }