Cómo navegar por una ruta

Sigue esta guía para trazar una ruta dentro de tu app a un solo destino mediante el SDK de Navigation para iOS.

Descripción general

  1. Integra el SDK de Navigation en tu app, como se describe en la sección Configura tu proyecto.
  2. Configura una GMSMapView.
  3. Solicita al usuario que acepte los Términos y Condiciones, y autoriza los servicios de ubicación y las notificaciones en segundo plano.
  4. Crea un array que contenga uno o más destinos.
  5. Define un objeto GMSNavigator para controlar la navegación paso a paso.

Consulta el código

Solicita al usuario las autorizaciones necesarias

Antes de usar el SDK de Navigation, el usuario debe aceptar los Términos y Condiciones, y autorizar el uso de los servicios de ubicación, que son necesarios para la navegación. Si tu app se ejecutará en segundo plano, también deberá solicitar al usuario que autorice las notificaciones de alerta de orientación. En esta sección, se indica cómo mostrar los mensajes de autorización necesarios.

Autoriza los servicios de ubicación

El SDK de Navigation usa servicios de ubicación, que requieren la autorización del usuario. Para habilitar los servicios de ubicación y mostrar el diálogo de autorización, sigue estos pasos:

  1. Agrega la clave NSLocationAlwaysUsageDescription a Info.plist.
  2. En cuanto al valor, agrega una explicación breve de por qué tu app requiere servicios de ubicación. Por ejemplo: "Esta app necesita permiso para usar los servicios de ubicación para la navegación paso a paso".

  3. Para mostrar el diálogo de autorización, llama a requestAlwaysAuthorization() de la instancia del administrador de ubicaciones.

Swift

self.locationManager.requestAlwaysAuthorization()

Objective‑C

[_locationManager requestAlwaysAuthorization];

Autoriza las notificaciones de alerta para obtener orientación en segundo plano

El SDK de Navigation necesita permiso del usuario para proporcionar notificaciones de alerta cuando la app se ejecuta en segundo plano. Agrega el siguiente código a fin de solicitar permiso al usuario para mostrar estas notificaciones:

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

Acepta los Términos y Condiciones.

Usa el siguiente código para mostrar el diálogo de los Términos y Condiciones, y habilitar la navegación cuando el usuario las acepte. Ten en cuenta que este ejemplo incluye el código para los servicios de ubicación y las notificaciones de alertas de orientación (que se mostró antes).

Swift

let companyName = "Ride Sharing Co."
GMSNavigationServices.showTermsAndConditionsDialogIfNeeded(
  withCompanyName: companyName) { 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

NSString *companyName = @"Ride Sharing Co.";
[GMSNavigationServices
  showTermsAndConditionsDialogIfNeededWithCompanyName:companyName
  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.
   }
 }];

Crea una ruta y comienza indicaciones

Para trazar una ruta, llama al método setDestinations() de Navigator con un array que contenga uno o más destinos (GMSNavigationWaypoint) que deseas visitar. Si se calcula de forma correcta, la ruta se muestra en el mapa. Para iniciar las indicaciones a lo largo de la ruta, comenzando por el primer destino, establece isGuidanceActive en true en la devolución de llamada.

En el ejemplo siguiente:

  • Crea una ruta nueva con dos destinos.
  • Iniciando guía.
  • Habilitando notificaciones de orientación en segundo plano.
  • Simular el viaje a lo largo de la ruta (opcional)
  • Configurando el modo de la cámara en "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 obtener más información sobre los IDs de lugar, consulta el artículo IDs de lugar.

Configurar medio de transporte

El modo de viaje determina qué tipo de ruta se recuperará y la forma en que se determina el curso del usuario. Puedes configurar uno de los cuatro modos de viaje para una ruta: en automóvil, en bicicleta, a pie y en taxi. En los modos en automóvil y taxi, el rumbo del usuario se basa en la dirección de desplazamiento. En los modos en bicicleta y a pie, el recorrido se representa según la dirección a la que apunta el dispositivo.

Configura la propiedad travelMode de la vista de mapa, como se muestra en el siguiente ejemplo:

Swift

self.mapView.travelMode = .cycling

Objective‑C

_mapView.travelMode = GMSNavigationTravelModeCycling;

Establecer rutas que se deben evitar

Usa las propiedades avoidsHighways y avoidsTolls BOOL para evitar autopistas o rutas con peaje en una ruta.

Swift

self.mapView.navigator?.avoidsTolls = true

Objective‑C

_mapView.navigator.avoidsTolls = YES;

Buscador de PlaceID

Puedes usar PlaceID Finder para encontrar IDs de lugar y usarlos para los destinos de las rutas.

Texto flotante

Puedes agregar texto flotante en cualquier lugar de la app, siempre y cuando no se abarque la atribución de Google. El SDK de Navigation no admite anclar el texto a una latitud o longitud en el mapa, ni a una etiqueta. Para obtener más información, consulta Ventanas de información.