Configurar interrupções em tempo real
As interrupções em tempo real são um conjunto de recursos que alertam os usuários sobre interrupções ao longo do trajeto e permitem que eles denunciem e verifiquem as interrupções encontradas. Exemplos de interrupções incluem acidentes de veículo, congestionamento, presença de polícia e radares de velocidade, obras, interdições de faixas e determinadas condições climáticas. Esta página explica os recursos de interrupção em tempo real e as opções de configuração deles, incluindo considerações para apps que usam interfaces de navegação personalizadas.
Recursos de interrupção em tempo real
O SDK Navigation inclui os seguintes recursos de interrupção em tempo real como parte da experiência principal de navegação:- Alertas interativos de interrupção ao longo das rotas.
- Alertas automáticos de interrupção com votação durante a navegação ativa.
- Denúncia de interrupções durante a navegação ativa.
Esses recursos são configuráveis e ativados por padrão. As seções a seguir fornecem mais informações sobre os recursos e as opções de configuração disponíveis.
Avisos interativos de interrupção ao longo das rotas
Quando um app mostra um trajeto, seja em uma visão geral ou durante a navegação ativa, as interrupções atuais aparecem como indicadores ao longo do trajeto. Os avisos incluem um ícone que indica o tipo de interrupção.

Você pode controlar a exibição de alertas de interrupção ao longo das rotas usando shouldDisplayPrompts
, que também controla a exibição de alertas automatizados quando um usuário se aproxima de uma interrupção.
mapView.navigator.shouldDisplayPrompts = true
Mostrar detalhes da interrupção quando um usuário tocar em uma callout
Os usuários podem tocar em um destaque para mostrar um card de informações com mais detalhes sobre a interrupção, incluindo o tipo, a hora em que foi informada pela última vez e, em alguns casos, uma opção para votar se ela ainda está presente. Há dois tipos diferentes de cards de informações que podem aparecer, dependendo se o usuário está em navegação ativa. As opções de configuração variam para cada tipo.
Cards de informações de destaque nas visões gerais de rotas antes de iniciar a navegação ativa
Quando um usuário toca em uma indicação em uma visão geral da rota antes de iniciar a navegação ativa, um card de informações aparece com mais detalhes sobre a interrupção.

Você pode controlar a capacidade dos usuários de tocar em indicadores de interrupção nos resumos de rotas para mostrar mais informações usando showsIncidentCards
.
mapView.settings.showsIncidentCards = true
Cards de informações de destaque durante a navegação ativa
Quando um alerta de interrupção aparece em uma rota durante a navegação ativa, os usuários podem tocar nele para mostrar um card com mais informações sobre a interrupção, incluindo o tipo e a hora em que ela foi informada pela última vez, além de botões para votar se a interrupção ainda está presente. Os votos enviados pelos usuários são processados pelo Google e podem aparecer no mapa para outros usuários do Google Maps e do SDK Navigation, além de serem usados para determinar se a interrupção deve continuar sendo mostrada.

Você pode controlar a exibição e a capacidade de tocar em alertas de interrupção durante a navegação ativa usando
shouldDisplayPrompts
, que também controla a
exibição de alertas ao longo das rotas e a
exibição de alertas automáticos quando um usuário se aproxima de uma interrupção.
mapView.navigator.shouldDisplayPrompts = true
Alertas automáticos de interrupção com votação durante a navegação ativa
Durante a navegação ativa, quando um usuário se aproxima de uma interrupção em um trajeto, uma solicitação aparece com informações sobre a interrupção e botões para votar se ela ainda está presente. Os votos enviados pelos usuários são processados pelo Google e podem aparecer no mapa para outros usuários do SDK do Google Maps e de navegação. Além disso, eles são usados para determinar se a interrupção deve continuar sendo mostrada.

É possível configurar a exibição de solicitações de alerta durante a navegação ativa usando
shouldDisplayPrompts
, que também controla a exibição
de balões ao longo das rotas.
mapView.navigator.shouldDisplayPrompts = true
Relatório de interrupções durante a navegação ativa
Durante o modo de navegação ativa, um botão aparece na interface de navegação para que os usuários possam informar novas interrupções ao longo do trajeto. Quando um usuário toca no botão, um menu com os tipos de interrupção disponíveis para denúncia aparece. Os alertas enviados pelos usuários são processados pelo Google e podem aparecer no mapa para outros usuários do SDK Navigation e do Google Maps.


Mostrar ou ocultar o botão de relatórios padrão
É possível configurar a visibilidade do botão de relatórios padrão durante a navegação ativa usando
navigationReportIncidentButtonEnabled
.
// Enables the incident reporting FAB to show in situations where incident // reporting is possible. mapView.settings.navigationReportIncidentButtonEnabled = true
Adicionar um botão de geração de relatórios personalizados
Em vez do botão padrão de denúncia de interrupção, você pode adicionar um botão personalizado à interface de navegação. Quando o usuário clica no botão personalizado, você pode acionar a exibição do menu de relatórios chamando o método presentReportIncidentsPanel
. Antes de adicionar um botão de denúncia personalizada, verifique se o app está em navegação ativa e se o usuário está em um país onde a denúncia está ativada chamando reportIncidentsAvailable
. Se uma dessas condições não for verdadeira, o menu de denúncia não vai aparecer.
// 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. } }
Trabalhar com interfaces de navegação personalizadas
Se a implementação do SDK Navigation incluir elementos de interface personalizados, considere os elementos de interrupção em tempo real para evitar conflitos.
Posicionamento do botão de denúncia
Por padrão, o botão de denúncia de interrupção fica na parte de baixo/canto final do mapa, à direita para idiomas da esquerda para a direita e à esquerda para idiomas da direita para a esquerda. Se você precisar mover o botão de geração de relatórios para abrir espaço para elementos de interface personalizados, use umbottomTrailingButtonsLayoutGuide
.
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 (experimental)
A API Prompt Visibility ajuda a evitar conflitos entre elementos de interface gerados pelo SDK Navigation e seus próprios elementos de interface personalizados. Para isso, ela adiciona um listener para receber um callback antes que um elemento de interface do SDK Navigation apareça e assim que ele for removido. Você pode receber callbacks para elementos de interrupção em tempo real, incluindo cards de informações, solicitações e o menu de denúncia de interrupções, além de outras notificações geradas pelo 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. } ...