Selecciona la plataforma: Android iOS

Configura las 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 de interrupción interactivos 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. Cuando habilitas la capa de tráfico, las interrupciones fuera de la ruta también aparecen en el mapa. Los avisos incluyen un ícono que indica el tipo de interrupción.

Textos destacados a lo largo de las rutas

Puedes controlar la visualización de los avisos de interrupción 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

Si se presiona un aviso de interrupción, se abre una tarjeta de información con más detalles. Esto se aplica a los avisos dentro y fuera de la ruta, aunque los avisos fuera de la ruta solo aparecen si la capa de tráfico está habilitada. La tarjeta muestra el tipo de interrupción, la hora en que se informó por última vez y, a veces, una opción para votar si la interrupción aún está presente. El tipo de tarjeta de información y sus opciones de configuración varían según si el usuario está en navegación activa.

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

Antes de iniciar la navegación activa, los usuarios pueden presionar un aviso dentro o fuera de la ruta en el mapa o la descripción general de la ruta para abrir una tarjeta de información. Los avisos fuera de la ruta requieren que la capa de tráfico esté habilitada. La tarjeta de información proporciona más detalles sobre la interrupción.

Tarjeta de información general

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

mapView.settings.showsIncidentCards = true

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

Durante la navegación activa, los usuarios pueden presionar un aviso de interrupción dentro o fuera de la ruta para abrir una tarjeta de información. La tarjeta muestra el tipo de interrupción y la hora en que se informó por última vez, e incluye botones para que los usuarios voten si la interrupción aún está presente.

La votación está disponible para las interrupciones dentro y fuera de la ruta en un radio de 5 km del usuario, excepto los cierres de rutas. Google procesa estos votos para ayudar a determinar si se debe seguir mostrando la interrupción. Los votos también pueden aparecer en el mapa para otros usuarios de Google Maps y del SDK de Navigation.

Tarjeta de información de navegación activa

Puedes controlar la visualización y la capacidad de presionar los avisos de interrupción 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 de interrupción automáticas 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, además de 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 interrupción 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 interrupción 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 denuncia Menú de informes

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

Puedes configurar la visibilidad del botón de informe 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 informe personalizado

En lugar del botón de informe de interrupción estándar, puedes agregar un botón de informe 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 informe 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 no se cumple ninguna de estas condiciones, 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.
          }
     }

Trabaja 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 informe

De forma predeterminada, el botón de informe de interrupción se ubica en la esquina inferior o final del mapa, en el lado derecho para los idiomas de izquierda a derecha y en el lado izquierdo para los idiomas de derecha a izquierda. Si necesitas mover el botón de informe 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. Para ello, agrega 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 informe 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.
}
...