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:- Avisos de interrupción interactivos a lo largo de las rutas.
- Alertas de interrupción automáticas con votación durante la navegación activa.
- Informes de interrupción durante la navegación activa.
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.
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.
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.
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.
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.
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 unbottomTrailingButtonsLayoutGuide.
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. } ...