Selecionar 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 informem e verifiquem as interrupções encontradas. Exemplos de interrupções incluem acidentes de veículos, congestionamento de trânsito, presença de policiais 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, 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 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.

Indicações interativas de interrupções ao longo das rotas

Quando um app mostra um trajeto, seja em uma visão geral ou durante a navegação ativa, todas as interrupções atuais aparecem como indicações ao longo do trajeto. Quando você ativa a camada de trânsito, as interrupções fora do trajeto também aparecem no mapa. As indicações 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 indicações 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 toca em uma indicação

Tocar em uma indicação de interrupção abre um card de informações com mais detalhes. Isso se aplica a indicações no trajeto e fora dele, embora as indicações fora do trajeto só apareçam se a camada de trânsito estiver ativada. O card mostra o tipo de interrupção, a hora em que ela foi informada pela última vez e, às vezes, uma opção para votar se a interrupção ainda está presente. O tipo de card de informações e as opções de configuração variam dependendo se o usuário está na navegação ativa.

Cards de informações de indicações em visões gerais do trajeto, antes de iniciar a navegação ativa

Antes de iniciar a navegação ativa, os usuários podem tocar em uma indicação 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 fornece mais detalhes sobre a interrupção.

Card de informações da visão geral

Você pode controlar a capacidade dos usuários de tocar em indicações de interrupção nas visões gerais do trajeto para mostrar mais informações usando showsIncidentCards.

mapView.settings.showsIncidentCards = true

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

Durante a navegação ativa, os usuários podem tocar em uma indicação de interrupção no trajeto ou fora dele para abrir um card de informações. O card mostra o tipo de interrupção e a última hora informada, e inclui botões para que os usuários votem 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 interdições de vias. O Google processa esses votos para ajudar a determinar se a interrupção deve continuar sendo mostrada. Os votos também podem aparecer no mapa para outros usuários do Google Maps e do SDK Navigation.

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

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

mapView.navigator.shouldDisplayPrompts = true

Alertas de interrupção automatizados com votação durante a navegação ativa

Durante a navegação ativa, quando um usuário se aproxima de uma interrupção ao longo de um trajeto, um aviso aparece com informações sobre a interrupção e 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.

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

Você pode configurar a exibição de avisos de alerta durante a navegação ativa usando shouldDisplayPrompts, que também controla a exibição de indicações ao longo das rotas.

mapView.navigator.shouldDisplayPrompts = true

Relatórios de interrupção durante a navegação ativa

Durante o modo de navegação ativa, um botão aparece na interface de navegação que permite 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 aparece. Os relatórios 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 "Denunciar" Menu "Relatórios"

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

Você pode configurar a visibilidade do botão de relatório 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 de relatório de interrupção padrão, você pode adicionar um botão de relatório personalizado à interface de navegação. Quando o usuário clica no botão personalizado, você pode acionar a exibição do menu de relatório chamando o presentReportIncidentsPanel método. Antes de adicionar um botão de relatório personalizado, verifique se o app está na navegação ativa e se o usuário está em um país em que o relatório está ativado chamando reportIncidentsAvailable. Se uma dessas condições não for verdadeira, o menu de relatório 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, você precisará considerar os elementos de interrupção em tempo real para evitar conflitos.

Posicionamento do botão de relatório

Por padrão, o botão de relatório de interrupção é posicionado na extremidade inferior/canto 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 relatório para abrir espaço para elementos de 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 elementos da interface gerados pelo SDK Navigation e seus próprios elementos da interface personalizados, adicionando um listener para receber um callback antes que um elemento da interface do SDK Navigation apareça e assim que o elemento for removido. Você pode receber callbacks para elementos de interrupção em tempo real, incluindo cards de informações, avisos e o menu de relatório de interrupção, bem como para 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.
}
...