Navegar em uma rota

Siga este guia para traçar uma rota no seu app até um único destino usando o SDK do Navigation para iOS.

Visão geral

  1. Integre o SDK do Navigation ao seu app, conforme descrito na seção Configurar o projeto.
  2. Configure um GMSMapView.
  3. Peça ao usuário para aceitar os Termos e Condições e autorizar os serviços de localização e as notificações em segundo plano.
  4. Crie uma matriz contendo um ou mais destinos.
  5. Defina um GMSNavigator para controlar a navegação guiada.

Achou o código?

Pedir as autorizações necessárias ao usuário

Antes de usar o SDK do Navigation, o usuário precisa aceitar os Termos e Condições e autorizar o uso dos serviços de localização, que são necessários para a navegação. Se o app for executado em segundo plano, ele também precisará pedir ao usuário para autorizar as notificações de alerta de orientação. Esta seção mostra como exibir os avisos de autorização necessários.

Autorizar serviços de localização

O SDK do Navigation usa serviços de localização, que exigem autorização do usuário. Para ativar os serviços de localização e mostrar a caixa de diálogo de autorização, siga estas etapas:

  1. Ative os recursos de localização e segundo plano no Xcode:

    1. Abra seu destino no Xcode e selecione a guia Signing &Capabilities. Para mais detalhes, consulte o guia da Apple sobre como adicionar recursos ao seu app.
    2. Adicione os recursos Location (Always) e Location (When In Use). No campo de texto de cada um, adicione uma breve explicação de por que seu app exige serviços de localização (por exemplo: "Este app precisa de permissão para usar serviços de localização para navegação curva a curva").
    3. Adicione o recurso Background Modes e selecione a caixa de seleção Location updates. Sem esse recurso, o app falha ao iniciar a navegação. Para mais detalhes, consulte o guia da Apple sobre como processar atualizações de localização em segundo plano.
  2. Para exibir a caixa de diálogo de autorização, chame o requestAlwaysAuthorization() método da instância do gerenciador de localização.

Swift

self.locationManager.requestAlwaysAuthorization()

Objective-C

[_locationManager requestAlwaysAuthorization];

Consulte a documentação completa da Apple sobre a autorização do serviço de localização.

Autorizar notificações de alerta para orientação em segundo plano

O SDK do Navigation precisa da permissão do usuário para fornecer notificações de alerta quando o app está em execução em segundo plano. Adicione o código a seguir para pedir permissão ao usuário para mostrar essas notificações:

Swift

UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
  granted, error in
    // Handle denied authorization to display notifications.
    if !granted || error != nil {
      print("User rejected request to display notifications.")
    }
}

Objective-C

// Request authorization for alert notifications.
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNAuthorizationOptions options = UNAuthorizationOptionAlert;
[center requestAuthorizationWithOptions:options
                      completionHandler:
 ^(
   BOOL granted,
   NSError *_Nullable error) {
     if (!error && granted) {
       NSLog(@"iOS Notification Permission: newly Granted");
     } else {
       NSLog(@"iOS Notification Permission: Failed or Denied");
     }
   }];

Autorizar sensores de movimento

Em uma versão principal futura, o SDK do Navigation para iOS combina dados de localização principais com sensores de movimento do dispositivo (CMAltimeter) para calcular a altitude de roteamento. Quando o SDK acessa o altímetro, o iOS usa automaticamente essa string para pedir permissão ao usuário.

A adição dessa chave agora não tem impacto no comportamento atual, mas evita falhas de inicialização ao fazer upgrade do SDK mais tarde.

Para se preparar para upgrades futuros do SDK, configure as autorizações do sensor de movimento da seguinte maneira:

  1. Abra seu destino no Xcode e navegue até a guia Info ou abra o arquivo Info.plist.

  2. Adicione uma nova chave: Privacy - Motion Usage Description (NSMotionUsageDescription).

  3. Adicione uma breve explicação para o usuário. Por exemplo: "Este app exige acesso ao sensor de movimento para calcular a altitude e melhorar a precisão do roteamento do mapa".

Aceite os Termos e Condições

Use o código a seguir para mostrar a caixa de diálogo de Termos e Condições e ativar a navegação quando o usuário aceitar os termos. Este exemplo inclui o código para serviços de localização e notificações de alerta de orientação (mostrados anteriormente).

Swift

  let termsAndConditionsOptions = GMSNavigationTermsAndConditionsOptions(companyName: "Ride Sharing Co.")

  GMSNavigationServices.showTermsAndConditionsDialogIfNeeded(
    with: termsAndConditionsOptions) { termsAccepted in
    if termsAccepted {
      // Enable navigation if the user accepts the terms.
      self.mapView.isNavigationEnabled = true
      self.mapView.settings.compassButton = true

      // Request authorization to use location services.
      self.locationManager.requestAlwaysAuthorization()

      // Request authorization for alert notifications which deliver guidance instructions
      // in the background.
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
      granted, error in
        // Handle rejection of notification authorization.
        if !granted || error != nil {
          print("Authorization to deliver notifications was rejected.")
        }
      }
    } else {
      // Handle rejection of terms and conditions.
    }
  }

Objective-C

GMSNavigationTermsAndConditionsOptions *termsAndConditionsOptions = [[GMSNavigationTermsAndConditionsOptions alloc] initWithCompanyName:@"Ride Sharing Co."];

[GMSNavigationServices
  showTermsAndConditionsDialogIfNeededWithOptions:termsAndConditionsOptions
  callback:^(BOOL termsAccepted) {
   if (termsAccepted) {
     // Enable navigation if the user accepts the terms.
     _mapView.navigationEnabled = YES;
     _mapView.settings.compassButton = YES;

     // Request authorization to use the current device location.
     [_locationManager requestAlwaysAuthorization];

     // Request authorization for alert notifications which deliver guidance instructions
     // in the background.
     UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
     UNAuthorizationOptions options = UNAuthorizationOptionAlert;
     [center requestAuthorizationWithOptions:options
                           completionHandler:
     ^(
       BOOL granted,
       NSError *_Nullable error) {
         if (!error && granted) {
           NSLog(@"iOS Notification Permission: newly Granted");
         } else {
           NSLog(@"iOS Notification Permission: Failed or Denied");
         }
       }];
   } else {
     // Handle rejection of the terms and conditions.
   }
 }];

Criar uma rota e iniciar a orientação

Para traçar uma rota, chame o método setDestinations do navegador com uma matriz de um ou mais GMSNavigationWaypoint destinos a serem visitados. Se a rota for calculada corretamente, ela vai aparecer no mapa. Para iniciar a orientação ao longo da rota, defina isGuidanceActive como true no callback.

O exemplo abaixo mostra:

  • Como criar uma nova rota com um destino.
  • Como iniciar a orientação.
  • Como ativar as notificações de orientação em segundo plano.
  • Como simular viagens ao longo da rota (opcional).
  • Como definir o modo da câmera como "seguir" (opcional).

Swift

func startNav() {
  var destinations = [GMSNavigationWaypoint]()
  destinations.append(GMSNavigationWaypoint.init(placeID: "ChIJnUYTpNASkFQR_gSty5kyoUk",
                                                 title: "PCC Natural Market")!)

  mapView.navigator?.setDestinations(destinations) { routeStatus in
    self.mapView.navigator?.isGuidanceActive = true
    self.mapView.locationSimulator?.simulateLocationsAlongExistingRoute()
    self.mapView.cameraMode = .following
  }
}

Objective-C

- (void)startNav {
  NSArray<GMSNavigationWaypoint *> *destinations =
  @[[[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJnUYTpNASkFQR_gSty5kyoUk"
                                             title:@"PCC Natural Market"]];

  [_mapView.navigator setDestinations:destinations
                             callback:^(GMSRouteStatus routeStatus){
                               [_mapView.locationSimulator simulateLocationsAlongExistingRoute];
                               _mapView.navigator.guidanceActive = YES;
                               _mapView.cameraMode = GMSNavigationCameraModeFollowing;
                             }];
}

Para saber mais sobre IDs de lugar, consulte IDs de lugar.

Cenários de várias paradas

É possível configurar um máximo de 25 paradas.

O método setDestinations não oferece suporte a viagens com várias paradas. Use continueToNextDestinationWithCompletion() para avançar a parada para a próxima etapa da viagem.

Escolher meio de transporte

O modo de viagem define o tipo de rota a ser buscada e como determinar o curso do usuário. É possível definir um dos quatro modos de viagem para uma rota: carro, bicicleta, caminhada e táxi. No modo de carro e táxi, o curso do usuário é baseado na direção da viagem. No modo de ciclismo e caminhada, o curso é representado pela direção para a qual o dispositivo está voltado (para a parte de cima do dispositivo no modo paisagem).

Defina a travelMode propriedade da visualização do mapa, conforme mostrado no exemplo a seguir:

Swift

self.mapView.travelMode = .cycling

Objective-C

_mapView.travelMode = GMSNavigationTravelModeCycling;

Definir vias a serem evitadas

Use as propriedades avoidsHighways e avoidsTolls BOOL para evitar rodovias, estradas com pedágio ou ambas ao longo de uma rota.

Swift

self.mapView.navigator?.avoidsTolls = true

Objective-C

_mapView.navigator.avoidsTolls = YES;

Definir o volume da orientação por áudio

Para ajustar o volume da orientação por voz, defina a propriedade volumeLevel no navegador como baixa, normal ou alta. O navegador usa o último nível de volume persistido ou o padrão normal.

Swift

self.mapView.navigator?.volumeLevel = .low

Objective-C

_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;

Localizador de IDs de lugar

Use o localizador de IDs de lugar para encontrar IDs de lugar a serem usados para destinos de rota. Adicione um destino de um placeID com GMSNavigationWaypoint.

Texto flutuante

Você pode adicionar texto flutuante em qualquer lugar do seu app, desde que a atribuição do Google não esteja coberta. O SDK do Navigation não oferece suporte à ancoragem do texto a coordenadas específicas (latitude, longitude) no mapa ou a um rótulo. Para mais informações, consulte Balões de informação.