Navegar em uma rota

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

Visão geral

  1. Integre o SDK de navegação ao seu app, conforme descrito na seção Configurar seu 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 com um ou mais destinos.
  5. Defina um GMSNavigator para controlar a navegação passo a passo.

Achou o código?

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

Antes de usar o SDK de navegação, o usuário precisa concordar com os termos e condições e autorizar o uso de serviços de localização, o que é necessário 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 mostrar as solicitações de autorização necessárias.

Autorizar os serviços de localização

O SDK 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. Adicione a chave NSLocationAlwaysUsageDescription a Info.plist.
  2. Para o valor, adicione uma explicação breve sobre por que o app requer serviços de localização. Por exemplo: "Este app precisa de permissão para usar serviços de localização para navegação passo a passo".

  3. Para mostrar a caixa de diálogo de autorização, chame requestAlwaysAuthorization() da instância do gerenciador de local.

Swift

self.locationManager.requestAlwaysAuthorization()

Objective-C

[_locationManager requestAlwaysAuthorization];

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

O SDK de navegação precisa da permissão do usuário para enviar notificações de alerta quando o app está em execução em segundo plano. Adicione o código abaixo para solicitar ao usuário permissão 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");
     }
   }];

Aceite os Termos e Condições

Use o código abaixo 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 (mostrado 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 que contenha um ou mais destinos (GMSNavigationWaypoint) a serem visitados. Se o cálculo for bem-sucedido, o trajeto vai aparecer no mapa. Para iniciar a orientação ao longo do trajeto, começando pelo primeiro destino, defina isGuidanceActive como true no callback.

O exemplo abaixo mostra:

  • Criação de uma nova rota com dois destinos.
  • Iniciando a orientação.
  • Ativar as notificações de orientação em segundo plano.
  • Simular o trajeto (opcional).
  • 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")!)
  destinations.append(GMSNavigationWaypoint.init(placeID:"ChIJJ326ROcSkFQRBfUzOL2DSbo",
                                                 title:"Marina Park")!)

  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"],
    [[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJJ326ROcSkFQRBfUzOL2DSbo"
                                             title:@"Marina Park"]];

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

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

Escolher meio de transporte

O modo de viagem determina qual tipo de rota será buscado e como o percurso do usuário é determinado. É possível definir um dos quatro modos de transporte para uma rota: carro, bicicleta, a pé e táxi. No modo de carro e táxi, o percurso do usuário é baseado na direção da viagem. No modo de bicicleta e a pé, o percurso é representado pela direção em que o dispositivo está virado.

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

Swift

self.mapView.travelMode = .cycling

Objective-C

_mapView.travelMode = GMSNavigationTravelModeCycling;

Definir vias a evitar

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

Swift

self.mapView.navigator?.avoidsTolls = true

Objective-C

_mapView.navigator.avoidsTolls = YES;

Localizador de ID do lugar

Use o Localizador de IDs de lugar para encontrar IDs de lugar para usar nos destinos do trajeto. Adicione um destino de um placeID com GMSNavigationWaypoint.

Texto flutuante

É possível adicionar texto flutuante em qualquer lugar do app, desde que a atribuição do Google não seja coberta. O SDK de navegação não oferece suporte à ancoragem do texto a uma latitude/longitude no mapa ou a um rótulo. Para mais informações, consulte Janelas de informações.