Selecciona la plataforma: Android iOS

Cómo configurar interrupciones en tiempo real

Las interrupciones en tiempo real son un conjunto de funciones que alertan a los usuarios sobre las interrupciones en su ruta y les permiten informar y verificar las interrupciones que encuentran. Entre los ejemplos de interrupciones, se incluyen accidentes automovilísticos, congestión de tráfico, presencia de policías y radares de velocidad, construcciones, cierres de carriles y ciertas condiciones climáticas. En esta página, se explican las funciones de interrupción en tiempo real y sus opciones de configuración, incluidas las consideraciones para las apps que usan IUs de navegación personalizadas.

Funciones de interrupción en tiempo real

El SDK de Navigation incluye las siguientes funciones de interrupción en tiempo real como parte de la experiencia de navegación principal:

Estas funciones son configurables y están habilitadas de forma predeterminada. En las siguientes secciones, se proporciona más información sobre las funciones y las opciones de configuración disponibles.

Avisos interactivos de interrupciones a lo largo de las rutas

Cuando una app muestra una ruta, ya sea en una descripción general de la ruta o durante la navegación activa, las interrupciones actuales aparecen como avisos a lo largo de la ruta. Los avisos incluyen un ícono que indica el tipo de interrupción.

Indicadores en las rutas

Puedes controlar la visualización de los avisos de interrupciones a lo largo de las rutas con shouldDisplayPrompts, que también controla la visualización de alertas automáticas cuando un usuario se acerca a una interrupción.

mapView.navigator.shouldDisplayPrompts = true

Cómo mostrar los detalles de la interrupción cuando un usuario presiona un aviso

Los usuarios pueden presionar un aviso para mostrar una tarjeta de información con más detalles sobre la interrupción, incluido el tipo de interrupción, la hora en que se informó por última vez y, en algunos casos, una opción para votar si la interrupción aún está presente. Existen dos tipos diferentes de tarjetas de información que pueden aparecer, según si el usuario está en navegación activa, y las opciones de configuración varían para cada tipo.

Tarjetas de información de avisos en descripciones generales de rutas, antes de iniciar la navegación activa

Cuando un usuario presiona un aviso en una descripción general de la ruta, antes de iniciar la navegación activa, aparece una tarjeta de información con más detalles sobre la interrupción.

Tarjeta de información de resumen

Puedes controlar la capacidad de los usuarios para presionar avisos de interrupciones en las descripciones generales de rutas para mostrar más información con showsIncidentCards.

mapView.settings.showsIncidentCards = true

Tarjetas de información de avisos durante la navegación activa

Cuando aparece un aviso de interrupción a lo largo de una ruta durante la navegación activa, los usuarios pueden presionarlo para mostrar una tarjeta de información con más detalles sobre la interrupción, incluido el tipo de interrupción y la hora en que se informó por última vez, así como botones para votar si la interrupción aún está presente. Google procesa los votos enviados por los usuarios y puede mostrarlos en el mapa para otros usuarios de Google Maps y del SDK de Navigation, así como usarlos para determinar si se debe seguir mostrando la interrupción.

Tarjeta de información de navegación activa

Puedes controlar la visualización y la capacidad de presionar los avisos de interrupciones durante la navegación activa con shouldDisplayPrompts, que también controla la visualización de avisos a lo largo de las rutas y la visualización de alertas automáticas cuando un usuario se acerca a una interrupción.

mapView.navigator.shouldDisplayPrompts = true

Alertas automáticas de interrupciones con votación durante la navegación activa

Durante la navegación activa, cuando un usuario se acerca a una interrupción a lo largo de una ruta, aparece un mensaje con información sobre la interrupción y botones para votar si la interrupción aún está presente. Google procesa los votos enviados por los usuarios y puede mostrarlos en el mapa para otros usuarios de Google Maps y del SDK de Navigation, así como usarlos para determinar si se debe seguir mostrando la interrupción.

Tarjeta de información de navegación activa

Puedes configurar la visualización de mensajes de alerta durante la navegación activa con shouldDisplayPrompts, que también controla la visualización de avisos a lo largo de las rutas.

mapView.navigator.shouldDisplayPrompts = true

Informes de interrupciones durante la navegación activa

Durante el modo de navegación activa, aparece un botón en la IU de navegación que permite a los usuarios informar nuevas interrupciones a lo largo de su ruta. Cuando un usuario presiona el botón, aparece un menú con los tipos de interrupciones disponibles para informar. Google procesa los informes que envían los usuarios y puede mostrarlos en el mapa para otros usuarios de Google Maps y del SDK de Navigation.

Botón de informes Menú de informes

Cómo mostrar u ocultar el botón de informes estándar

Puedes configurar la visibilidad del botón de informes estándar durante la navegación activa con navigationReportIncidentButtonEnabled.

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

Cómo agregar un botón de informes personalizado

En lugar del botón de informes de interrupciones estándar, puedes agregar un botón de informes personalizado a la IU de navegación. Cuando el usuario hace clic en el botón personalizado, puedes activar la visualización del menú de informes llamando al método presentReportIncidentsPanel. Antes de agregar un botón de informes personalizado, verifica que la app esté en navegación activa y que el usuario se encuentre en un país en el que los informes estén habilitados llamando a reportIncidentsAvailable. Si alguna de estas condiciones no se cumple, no aparecerá el menú de informes.

  // 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.
          }
     }

Cómo trabajar con IUs de navegación personalizadas

Si tu implementación del SDK de Navigation incluye elementos de IU personalizados, debes tener en cuenta los elementos de interrupción en tiempo real para evitar conflictos.

Posicionamiento del botón de informes

De forma predeterminada, el botón de informes de interrupciones se posiciona en la esquina inferior o final del mapa, en el lado derecho para los idiomas que se leen de izquierda a derecha y en el lado izquierdo para los idiomas que se leen de derecha a izquierda. Si necesitas mover el botón de informes para dejar espacio para los elementos de IU personalizados, usa 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 de visibilidad de mensajes (experimental)

La API de visibilidad de mensajes te ayuda a evitar conflictos entre los elementos de la IU generados por el SDK de Navigation y tus propios elementos de IU personalizados agregando un objeto de escucha para recibir una devolución de llamada antes de que aparezca un elemento de la IU del SDK de Navigation y tan pronto como se quite el elemento. Puedes recibir devoluciones de llamada para elementos de interrupción en tiempo real, incluidas tarjetas de información, mensajes y el menú de informes de interrupciones, así como para otras notificaciones generadas por el SDK de 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.
}
...