Selecione a plataforma: Android iOS

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 no trajeto e permitem que eles denunciem e verifiquem as interrupções que encontram. Exemplos de interrupções incluem acidentes de veículos, congestionamentos, presença de policiais e radares de velocidade, obras, faixas interditadas e certas condições climáticas. Nesta página, explicamos os recursos de interrupção em tempo real e as opções de configuração, incluindo considerações para apps que usam interfaces de navegação personalizadas.

Recursos de interrupção em tempo real

O SDK do Navigation inclui os seguintes recursos de interrupção em tempo real como parte da experiência de navegação principal:

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.

Balões interativos de interrupção ao longo dos trajetos

Quando um app mostra um trajeto, seja em um panorama do trajeto ou durante a navegação ativa, as interrupções atuais aparecem como balões ao longo do caminho. Quando você ativa a camada de trânsito, as interrupções fora do trajeto também aparecem no mapa. As frases de destaque incluem um ícone que indica o tipo de interrupção.

Balões de texto ao longo dos trajetos

Você pode controlar a exibição de avisos de interrupção ao longo dos trajetos usando shouldDisplayPrompts, que também controla a exibição de alertas automáticos 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 um aviso

Toque em um aviso de interrupção para abrir um card de informações com mais detalhes. Isso se aplica a balões de texto no trajeto e fora dele, mas os balões fora do trajeto só aparecem se a camada de trânsito estiver ativada. O card mostra o tipo de interrupção, o horário em que foi relatada pela última vez e, às vezes, uma opção para votar se ela ainda está presente. O tipo de card de informações e as opções de configuração variam de acordo com o modo de navegação do usuário.

Cards de informações em panoramas de trajetos, antes de iniciar a navegação ativa

Antes de iniciar a navegação ativa, os usuários podem tocar em um aviso no trajeto ou fora dele no mapa ou no panorama do trajeto para abrir um card de informações. As indicações fora do trajeto exigem que a camada de trânsito esteja ativada. O card de informações mostra mais detalhes sobre a interrupção.

Card de informações gerais

Você pode controlar a capacidade dos usuários de tocar em avisos de interrupção nos panoramas do trajeto para exibir mais informações usando showsIncidentCards.

mapView.settings.showsIncidentCards = true

Cards de informações de balão durante a navegação ativa

Durante a navegação ativa, os usuários podem tocar em um aviso de interrupção no trajeto ou fora dele para abrir um card de informações. O card mostra o tipo de interrupção e o último horário informado, além de incluir botões para os usuários votarem se a interrupção ainda está presente.

A votação está disponível para interrupções no trajeto e fora dele em um raio de 5 km do usuário, exceto vias interditadas. O Google processa esses votos para determinar se deve continuar mostrando a interrupção. Os votos também podem aparecer no mapa para outros usuários do Google Maps e do SDK de navegação.

Card de informações de navegação ativa

Você pode controlar a exibição e a capacidade de tocar nas indicações de interrupção durante a navegação ativa usando shouldDisplayPrompts, que também controla a exibição de indicações ao longo dos trajetos e a exibição de alertas automáticos quando um usuário se aproxima de uma interrupção.

mapView.navigator.shouldDisplayPrompts = true

Alertas automatizados 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, aparece uma solicitação 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 Google Maps e do SDK de navegação, além de serem usados para determinar se a interrupção deve continuar sendo mostrada.

Card de informações de navegação ativa

É possível configurar a exibição de avisos de alerta durante a navegação ativa usando shouldDisplayPrompts, que também controla a exibição de balões de texto ao longo dos trajetos.

mapView.navigator.shouldDisplayPrompts = true

Relatórios 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 informem 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 informar é exibido. Os alertas 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.

Botão de denúncia Menu Alertas

Mostrar ou ocultar o botão de relatórios padrão

É possível configurar a visibilidade do botão de denúncia 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 relatório personalizado

Em vez do botão padrão de alerta de interrupção, você pode adicionar um botão personalizado à interface de navegação. Quando o usuário clica no botão personalizado, é possível acionar a exibição do menu de alertas chamando o método presentReportIncidentsPanel. Antes de adicionar um botão de relatório personalizado, verifique se o app está no modo de navegação ativa e se o usuário está em um país onde os relatórios estão ativados chamando reportIncidentsAvailable. Se uma dessas condições não for atendida, o menu Alertas 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 de Navigation incluir elementos da 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 relatório de interrupção fica no canto inferior/final do mapa, no lado direito para idiomas da esquerda para a direita e no lado esquerdo para idiomas da direita para a esquerda. Se você precisar mover o botão de denúncia para abrir espaço para elementos da interface personalizados, use um 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 (experimental)

A API Prompt Visibility ajuda a evitar conflitos entre os elementos da interface gerados pelo SDK de navegação e os elementos personalizados da interface adicionando um listener para receber um callback antes que um elemento da interface do SDK de navegação 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 Alertas, além de outras notificações geradas pelo SDK de navegação.

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