Ce guide explique comment permettre à votre application d'écouter et de répondre à différents événements qui changent lorsqu'un utilisateur suit un itinéraire. Il ne traite pas de la définition d'un itinéraire, mais uniquement de la réponse aux événements qui se produisent sur un itinéraire.
Présentation
Le SDK Navigation pour iOS vous fournit des écouteurs associés à la position de l'utilisateur, aux conditions de l'itinéraire et à des données importantes sur le temps et la distance. Dans le contrôleur de vue de la carte, votre application
doit adopter les protocoles de ces écouteurs :
GMSRoadSnappedLocationProviderListener
et
GMSNavigatorListener.
La liste suivante 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 l'itinéraire change.GMSNavigatorListener.didUpdateRemainingTime, appelé de manière répétée lorsque le temps avant la prochaine destination change, pendant que le guidage est actif.GMSNavigatorListener.didUpdateRemainingDistance, appelé de manière répétée lorsque la distance avant la prochaine destination change, pendant que le guidage est actif.GMSNavigatorListener.didUpdateDelayCategory, appelé lorsque la catégorie de retard avant la prochaine destination change, pendant que le guidage est actif.GMSNavigatorListener.didChangeSuggestedLightingMode, déclenché lorsque les conditions d'éclairage estimées sont mises à jour. Par exemple, lorsque la nuit tombe à l'endroit où se trouve l'utilisateur, l'éclairage change.GMSNavigatorListener.didUpdateSpeedingPercentage, déclenché lorsque le conducteur dépasse la limite de vitesse.GMSRoadSnappedLocationProviderListener.didUpdateLocation, appelé de manière répétée lorsque la position de l'utilisateur change.
Voir le code
Déclarer la 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];
Recevoir ou arrêter les mises à jour de la 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 la position | Description |
|---|---|
| altitude | Altitude actuelle. |
| coordinate.latitude | Coordonnée de latitude actuelle sur la route. |
| coordinate.longitude | Coordonnée de longitude actuelle sur la route. |
| cours | Cap actuel en degrés. |
| speed | Vitesse actuelle. |
| timestamp | Date/heure de la lecture actuelle. |
Pour recevoir des mises à jour continues de la position, 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 mises à jour de la 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. Vous pouvez reprendre le guidage et passer au point de cheminement suivant en appelant continueToNextDestinationWithCompletion(), puis en réactivant le guidage. Votre application doit réactiver le guidage après avoir appelé continueToNextDestinationWithCompletion().
Une fois que l'application appelle continueToNextDestinationWithCompletion, le navigateur ne dispose plus de données sur la destination précédente. Si vous souhaitez analyser des informations sur une étape de l'itinéraire, vous devez les récupérer auprès du navigateur avant d'appeler continueToNextDestinationWithCompletion().
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?.continueToNextDestinationWithCompletion { _, _ in }
mapView.navigator?.isGuidanceActive = true
}
Objective-C
- (void)navigator:(GMSNavigator *)navigator didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint {
NSLog(@"You have arrived at: %@", waypoint.title);
[_mapView.navigator continueToNextDestinationWithCompletion:^(GMSNavigationWaypoint *waypoint,
GMSRouteStatus status){
}];
_mapView.navigator.guidanceActive = YES;
}
Recevoir des mises à jour sur les changements d'itinéraire
Pour recevoir une notification chaque fois que l'itinéraire est modifié, créez une méthode pour gérer l'événement navigatorDidChangeRoute. Vous pouvez accéder au nouvel itinéraire à 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 mises à jour sur le temps avant la destination
Pour recevoir des mises à jour continues sur le temps avant la destination, créez une méthode pour gérer l'événement didUpdateRemainingTime. Le paramètre time fournit le temps estimé, en secondes, avant d'atteindre la prochaine destination.
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 modification minimale du temps estimé avant 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 mises à jour sur la distance avant la destination
Pour recevoir des mises à jour continues sur la distance avant la destination, créez une méthode pour gérer l'événement didUpdateRemainingDistance. Le paramètre distance fournit la distance estimée, en mètres, avant d'atteindre 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 modification minimale de la distance estimée avant 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 mises à jour sur le trafic
Pour recevoir des mises à jour continues sur le trafic pour le reste de l'itinéraire, créez une méthode pour 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 sur le trafic ne sont pas disponibles, GMSNavigationDelayCategory renvoie 0. Les nombres 1 à 3 indiquent une augmentation du flux, de léger à dense.
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 retard suivants :
| Catégorie de retard | Description |
|---|---|
| GMSNavigationDelayCategoryNoData | 0 – Non disponible, aucune donnée sur le trafic ni sur : |
| l'itinéraire. | |
| GMSNavigationDelayCategoryHeavy | 1 – Dense. |
| GMSNavigationDelayCategoryMedium | 2 – Moyen. |
| GMSNavigationDelayCategoryLight | 3 – Léger. |
Recevoir des mises à jour sur les excès de vitesse
Pour recevoir des mises à jour lorsqu'un conducteur dépasse la limite de vitesse, créez une méthode pour 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 mises à jour sur les changements d'éclairage estimés, créez une méthode pour 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;
}