Sélectionnez une plate-forme : Android iOS

Configurer les perturbations en temps réel

Les perturbations en temps réel sont un ensemble de fonctionnalités qui alertent les utilisateurs sur les perturbations sur leur itinéraire et leur permettent de signaler et de vérifier les perturbations qu'ils rencontrent. Les perturbations incluent, par exemple, les accidents de voiture, les embouteillages, la présence de la police et de radars, les travaux, les routes fermées et certaines conditions météorologiques. Cette page explique les fonctionnalités de perturbation en temps réel et leurs options de configuration, y compris les considérations pour les applications qui utilisent des UI de navigation personnalisées.

Fonctionnalités de perturbation en temps réel

Le SDK Navigation inclut les fonctionnalités d'interruption en temps réel suivantes dans l'expérience de navigation de base :

Ces fonctionnalités sont configurables et activées par défaut. Les sections suivantes fournissent plus d'informations sur les fonctionnalités et les options de configuration disponibles.

Callouts interactifs sur les perturbations le long des itinéraires

Lorsqu'une application affiche un itinéraire, que ce soit dans un aperçu de l'itinéraire ou pendant la navigation active, les perturbations en cours s'affichent sous forme d'encadrés le long de l'itinéraire. Lorsque vous activez le calque de trafic, les perturbations hors itinéraire s'affichent également sur la carte. Les encadrés incluent une icône indiquant le type de perturbation.

Encadrés le long des itinéraires

Vous pouvez contrôler l'affichage des encadrés d'informations sur les perturbations le long des itinéraires à l'aide de shouldDisplayPrompts, qui contrôle également l'affichage des alertes automatiques lorsqu'un utilisateur approche d'une perturbation.

mapView.navigator.shouldDisplayPrompts = true

Afficher les détails d'une perturbation lorsqu'un utilisateur appuie sur un encart

En appuyant sur un message d'interruption, vous ouvrez une fiche d'informations contenant plus de détails. Cela s'applique aux alertes sur l'itinéraire et hors itinéraire, mais les alertes hors itinéraire ne s'affichent que si la couche de trafic est activée. La fiche indique le type de perturbation, la date de la dernière signalisation et parfois une option permettant de voter pour indiquer si la perturbation est toujours présente. Le type de fiche info et ses options de configuration varient selon que l'utilisateur est en mode navigation active ou non.

Fiches d'informations sur les aperçus d'itinéraire, avant de démarrer la navigation active

Avant de démarrer la navigation active, les utilisateurs peuvent appuyer sur un repère sur l'itinéraire ou en dehors de l'itinéraire sur la carte ou dans l'aperçu de l'itinéraire pour ouvrir une fiche d'informations. Les alertes hors itinéraire nécessitent l'activation de la couche de trafic. La fiche d'informations fournit plus de détails sur la perturbation.

Fiche info "Vue d'ensemble"

Vous pouvez contrôler la capacité des utilisateurs à appuyer sur les encadrés d'informations sur les perturbations dans les aperçus d'itinéraire pour afficher plus d'informations à l'aide de showsIncidentCards.

mapView.settings.showsIncidentCards = true

Fiches d'informations pendant la navigation active

Pendant la navigation active, les utilisateurs peuvent appuyer sur un encart d'interruption sur l'itinéraire ou hors itinéraire pour ouvrir une fiche d'informations. La fiche indique le type de perturbation et la dernière heure signalée. Elle inclut des boutons permettant aux utilisateurs d'indiquer si la perturbation est toujours présente.

Les utilisateurs peuvent voter pour les perturbations sur l'itinéraire et en dehors de l'itinéraire dans un rayon de 5 km, à l'exception des routes fermées. Google traite ces votes pour déterminer s'il doit continuer à afficher l'indisponibilité. Les votes peuvent également apparaître sur la carte pour les autres utilisateurs du SDK Maps et Navigation.

Fiche info sur la navigation active

Vous pouvez contrôler l'affichage et la possibilité d'appuyer sur les encadrés d'informations sur les perturbations pendant la navigation active à l'aide de shouldDisplayPrompts, qui contrôle également l'affichage des encadrés d'informations le long des itinéraires et l'affichage des alertes automatiques lorsqu'un utilisateur approche d'une perturbation.

mapView.navigator.shouldDisplayPrompts = true

Alertes de perturbations automatiques avec vote pendant la navigation active

Lors de la navigation active, lorsqu'un utilisateur approche d'une perturbation sur un itinéraire, une invite s'affiche avec des informations sur la perturbation et des boutons permettant de voter pour indiquer si la perturbation est toujours présente. Les votes envoyés par les utilisateurs sont traités par Google et peuvent être affichés sur la carte pour les autres utilisateurs des SDK Google Maps et Navigation. Ils peuvent également servir à déterminer s'il faut continuer à afficher la perturbation.

Fiche info sur la navigation active

Vous pouvez configurer l'affichage des invites d'alerte pendant la navigation active à l'aide de shouldDisplayPrompts, qui contrôle également l'affichage des encadrés le long des itinéraires.

mapView.navigator.shouldDisplayPrompts = true

Signaler une perturbation pendant la navigation active

En mode de navigation active, un bouton s'affiche dans l'interface utilisateur de navigation. Il permet aux utilisateurs de signaler de nouveaux problèmes sur leur itinéraire. Lorsqu'un utilisateur appuie sur le bouton, un menu s'affiche avec les types de perturbations disponibles à signaler. Les signalements envoyés par les utilisateurs sont traités par Google et peuvent être affichés sur la carte pour les autres utilisateurs du SDK Navigation et Google Maps.

Bouton "Signaler" Menu "Signaler"

Afficher ou masquer le bouton "Rapports standards"

Vous pouvez configurer la visibilité du bouton de création de rapports standards pendant la navigation active à l'aide de navigationReportIncidentButtonEnabled.

// Enables the incident reporting FAB to show in situations where incident
// reporting is possible.
mapView.settings.navigationReportIncidentButtonEnabled = true

Ajouter un bouton de signalement personnalisé

Au lieu du bouton standard de signalement des perturbations, vous pouvez ajouter un bouton de signalement personnalisé à l'UI de navigation. Lorsque l'utilisateur clique sur le bouton personnalisé, vous pouvez déclencher l'affichage du menu de création de rapports en appelant la méthode presentReportIncidentsPanel. Avant d'ajouter un bouton de signalement personnalisé, vérifiez que l'application est en mode navigation active et que l'utilisateur se trouve dans un pays où le signalement est activé en appelant reportIncidentsAvailable. Si l'une de ces conditions n'est pas remplie, le menu "Rapports" ne s'affiche pas.

  // Check if reporting is available before displaying your button
  let isReportingAvailable = mapview.isIncidentReportingAvailable()
  customReportingIncidentButton.isHidden = !isReportingAvailable
  customReportingIncidentButton.addTarget(self, action: #selector(didTapReportIncidentButton), for: .touchUpInside)
  
  // Trigger the reporting flow if the button is clicked
  func didTapReportIncidentButton() {
          mapView.presentReportIncidentsPanel(self) { [weak self] error in
              guard let self = self else { return }
              if let error = error as NSError? {
                  if error.domain == GMSMapViewPresentReportIncidentPanelErrorDomain {
                      let errorCode = GMSMapViewPresentReportIncidentPanelErrorCode(rawValue: error.code)
                      
                      switch errorCode {
                      case .internal:
                          self.showErrorMessage(
                              title: "Error Presenting Report Incident Panel",
                              message: "An internal error occurred."
                          )
                      case .reportingNotAvailable:
                          self.showErrorMessage(
                              title: "Error Presenting Report Incident Panel",
                              message: "Reporting is not available."
                          )
                      case .none:
                          self.showErrorMessage(
                              title: "Error Presenting Report Incident Panel",
                              message: "An unknown error occurred."
                          )
                      }
                  } else {
                      // Handle other potential errors (e.g., network errors)
                      self.showErrorMessage(
                          title: "Error Presenting Report Incident Panel",
                          message: "An unexpected error occurred: \(error.localizedDescription)"
                      )
                  }
              }
              // If error is nil, the panel was presented successfully. You can add any extra logic here.
          }
     }

Utiliser des UI de navigation personnalisées

Si votre implémentation du SDK Navigation inclut des éléments d'interface utilisateur personnalisés, vous devez tenir compte des éléments de perturbation en temps réel pour éviter les conflits.

Positionnement du bouton "Signaler"

Par défaut, le bouton de signalement des perturbations est placé en bas/à l'angle de fin de la carte (à droite pour les langues qui se lisent de gauche à droite et à gauche pour celles qui se lisent de droite à gauche). Si vous devez déplacer le bouton de signalement pour faire de la place aux éléments d'UI personnalisés, utilisez un bottomTrailingButtonsLayoutGuide.

Swift

// Create a new layout guide
let topRightLayoutGuide = UILayoutGuide()
self.view.addLayoutGuide(topRightLayoutGuide)

// Activate constraints using fixed constants here as an example
// assuming the current reporting button is of fixed height
topRightLayoutGuide.topAnchor.constraint(equalTo: _mapView.navigationHeaderLayoutGuide.bottomAnchor, constant: 50).isActive = true
topRightLayoutGuide.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -14).isActive = true

// Assign the layout guide
_mapView.bottomTrailingButtonsLayoutGuide = topRightLayoutGuide

// Create an alternate layout guide to use when the header and the footer are not full width
let topRightAlternateLayoutGuide = UILayoutGuide()
self.view.addLayoutGuide(topRightAlternateLayoutGuide)

// Activate constraints using fixed constants here as an example
// assuming the current RTD button is of fixed height
topRightAlternateLayoutGuide.topAnchor.constraint(equalTo: _mapView.navigationHeaderLayoutGuide.bottomAnchor, constant: 20).isActive = true
topRightAlternateLayoutGuide.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -10).isActive = true

// Assign the layout guide
_mapView.bottomTrailingButtonsAlternateLayoutGuide = topRightAlternateLayoutGuide

Objective-C

// Create a new layout guide
UILayoutGuide *topRightLayoutGuide = [[UILayoutGuide alloc] init];
[self.view addLayoutGuide:topRightLayoutGuide];

// Activate constraints using fixed constants here as an example
// assuming the current RTD button is of fixed height
[[topRightLayoutGuide.topAnchor
    constraintEqualToAnchor:_mapView.navigationHeaderLayoutGuide.bottomAnchor
                   constant:50]
    setActive:YES];

[[topRightLayoutGuide.trailingAnchor
    constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor
                   constant:-14]
    setActive:YES];

// Assign the layout guide
_mapView.bottomTrailingButtonsLayoutGuide = topRightLayoutGuide;

// Create an alternate layout guide to use when the header and the footer are not full width
UILayoutGuide *topRightAlternateLayoutGuide = [[UILayoutGuide alloc] init];
[self.view addLayoutGuide:topRightAlternateLayoutGuide];

// Activate constraints using fixed constants here as an example
// assuming the current RTD button is of fixed height
[[topRightAlternateLayoutGuide.topAnchor
    constraintEqualToAnchor:_mapView.navigationHeaderLayoutGuide.bottomAnchor
                   constant:50]
    setActive:YES];

[[topRightAlternateLayoutGuide.trailingAnchor
    constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor
                   constant:-14]
    setActive:YES];

// Assign the layout guide
_mapView.bottomTrailingButtonsAlternateLayoutGuide = topRightAlternateLayoutGuide;

API Prompt Visibility (expérimentale)

L'API Prompt Visibility vous aide à éviter les conflits entre les éléments d'interface utilisateur générés par le SDK Navigation et vos propres éléments d'interface utilisateur personnalisés. Pour ce faire, elle ajoute un écouteur pour recevoir un rappel avant l'apparition d'un élément d'interface utilisateur du SDK Navigation et dès que l'élément est supprimé. Vous pouvez recevoir des rappels pour les éléments d'interruption en temps réel, y compris les fiches d'informations, les invites et le menu de signalement des interruptions, ainsi que pour les autres notifications générées par le SDK Navigation.

Swift

// Additional methods added to GMSNavigatorListener
...
func navigatorWillPresentPrompt(_ navigator: GMSNavigator) {
  // Hide any sort of custom UI element.
}

func navigatorDidDismissPrompt(_ navigator: GMSNavigator) {
  // Show any sort of custom UI element.
}
...

Objective-C

// Additional methods added to GMSNavigatorListener
...
- (void)navigatorWillPresentPrompt:(GMSNavigator *)navigator {
  // Hide any sort of custom UI element.
}

- (void)navigatorDidDismissPrompt:(GMSNavigator *)navigator {
  // Show any sort of custom UI element.
}
...