Navegar em uma rota

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

Visão geral

  1. Integre o SDK Navigation 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 o trajeto passo a passo.

Achou o código?

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

Antes de usar o SDK Navigation, o usuário precisa concordar com 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 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. No valor, adicione uma breve explicação de por que seu app precisa dos 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. Para mostrar a caixa de diálogo de autorização, chame requestAlwaysAuthorization() da instância do gerenciador de localização.

Swift

self.locationManager.requestAlwaysAuthorization()

Objective-C

[_locationManager requestAlwaysAuthorization];

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

O SDK Navigation 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 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");
     }
   }];

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 (mostradas 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 um trajeto, chame o método setDestinations() do Navigator com uma matriz que contenha um ou mais destinos (GMSNavigationWaypoint) a serem visitados. Se o cálculo for feito com sucesso, o trajeto será mostrado 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.
  • Orientação inicial.
  • Ativar 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 IDs de lugar, consulte IDs de lugar.

Escolher meio de transporte

O modo de viagem determina qual tipo de trajeto será buscado e a maneira como o curso do usuário é determinado. É possível definir um de quatro modos de viagem para uma rota: carro, bicicleta, a pé e táxi. Nos modos de carro e táxi, o trajeto do usuário é baseado na direção do deslocamento. Nos modos de bicicleta e a pé, o trajeto é representado pela direção em que o dispositivo está apontado (para cima no modo paisagem).

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 avoidsHighways e avoidsTolls BOOL para evitar rodovias e/ou vias com pedágio em uma rota.

Swift

self.mapView.navigator?.avoidsTolls = true

Objective-C

_mapView.navigator.avoidsTolls = YES;

Localizador de PlaceID

Use o Localizador de PlaceID para encontrar IDs de lugar que podem ser usados como destinos de rotas. Adicione um destino de um placeID com GMSNavigationWaypoint.

Texto flutuante

Você pode adicionar texto flutuante em qualquer lugar do app, desde que a atribuição do Google não seja coberta. O SDK Navigation 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.