Cómo navegar por una ruta

Sigue esta guía para trazar una ruta dentro de tu app a un solo destino con 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 un GMSMapView.
  3. Pídele al usuario que acepte los Términos y Condiciones, y que autorice 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 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 debe solicitarle al usuario que autorice las notificaciones de alerta de indicaciones. En esta sección, se muestra cómo mostrar las solicitudes de autorización necesarias.

Autoriza los servicios de ubicación

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

  1. Habilita las funciones de ubicación y segundo plano en Xcode:

    1. Abre tu destino en Xcode y selecciona la pestaña Signing &Capabilities. Para obtener más información, consulta la guía de Apple para agregar funciones a tu app .
    2. Agrega las funciones Location (Always) y Location (When In Use). En el campo de texto de cada una, agrega una breve explicación 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. Agrega la función Background Modes y, luego, selecciona la casilla de verificación Location updates. Sin esta función, la app falla cuando se inicia la navegación. Para obtener más información, consulta la guía de Apple para controlar las actualizaciones de ubicación en segundo plano.
  2. Para mostrar el diálogo de autorización, llama al requestAlwaysAuthorization() método de la instancia del administrador de ubicación.

Swift

self.locationManager.requestAlwaysAuthorization()

Objective-C

[_locationManager requestAlwaysAuthorization];

Consulta la documentación completa de Apple para la autorización del servicio de ubicación.

Autoriza las notificaciones de alerta para las indicaciones en segundo plano

El SDK de Navigation necesita el permiso del usuario para proporcionar notificaciones de alerta cuando la app se ejecuta en segundo plano. Agrega el siguiente código para solicitarle al usuario permiso 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");
     }
   }];

Autoriza los sensores de movimiento

En una versión principal futura, el SDK de Navigation para iOS combina datos de ubicación principales con sensores de movimiento del dispositivo (CMAltimeter) para calcular la altitud de la ruta. Cuando el SDK accede al altímetro, iOS usa automáticamente esta cadena para solicitarle permiso al usuario.

Agregar esta clave ahora no tiene ningún impacto en el comportamiento actual, pero evita fallas de inicialización cuando actualices el SDK más adelante.

Para prepararte para futuras actualizaciones del SDK, configura las autorizaciones del sensor de movimiento de la siguiente manera:

  1. Abre tu destino en Xcode y navega a la pestaña Info o abre tu archivo Info.plist.

  2. Agrega una clave nueva: Privacy - Motion Usage Description (NSMotionUsageDescription).

  3. Agrega una breve explicación para el usuario. Por ejemplo: "Esta app requiere acceso al sensor de movimiento para calcular la altitud y mejorar la precisión del enrutamiento del mapa".

Acepta los Términos y Condiciones.

Usa el siguiente código para mostrar el diálogo de Términos y Condiciones y habilitar la navegación cuando el usuario los acepte. Ten en cuenta que este ejemplo incluye el código para los servicios de ubicación y las notificaciones de alerta de indicaciones (que se mostraron 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.
   }
 }];

Crea una ruta y comienza las indicaciones

Para trazar una ruta, llama al método setDestinations del navegador con un array de uno o más GMSNavigationWaypoint destinos para visitar. Si la ruta se calcula correctamente, aparece en el mapa. Para iniciar las indicaciones a lo largo de la ruta, establece isGuidanceActive en true en la devolución de llamada.

En el ejemplo siguiente:

  • Se crea una ruta nueva con un destino.
  • Se inician las indicaciones.
  • Se habilitan las notificaciones de indicaciones en segundo plano.
  • Se simula el viaje a lo largo de la ruta (opcional).
  • Se establece el modo de cámara en "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 obtener información sobre los IDs de lugar, consulta IDs de lugar.

Situaciones de varias paradas

Puedes configurar un máximo de 25 puntos de ruta.

El método setDestinations no admite viajes con varias paradas. Usa continueToNextDestinationWithCompletion() para avanzar el punto de ruta a la siguiente etapa del viaje.

Definir medio de viaje

El modo de viaje define el tipo de ruta que se debe recuperar y cómo determinar el rumbo del usuario. Puedes establecer uno de los cuatro modos de viaje para una ruta: conducir, andar en bicicleta, caminar y taxi. En el modo de conducción y taxi, el rumbo del usuario se basa en la dirección del viaje; en el modo de ciclismo y caminata, el rumbo se representa mediante la dirección hacia la que apunta el dispositivo (hacia la parte superior del dispositivo en modo horizontal).

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

Swift

self.mapView.travelMode = .cycling

Objective-C

_mapView.travelMode = GMSNavigationTravelModeCycling;

Establece las rutas que se deben evitar

Usa las propiedades avoidsHighways y avoidsTolls BOOL para evitar autopistas, rutas con peaje o ambas a lo largo de una ruta.

Swift

self.mapView.navigator?.avoidsTolls = true

Objective-C

_mapView.navigator.avoidsTolls = YES;

Establece el volumen de las indicaciones de audio

Para ajustar el volumen de las indicaciones por voz, establece la propiedad volumeLevel del navegador en bajo, normal o alto. El navegador usa el último nivel de volumen persistente o el valor predeterminado normal.

Swift

self.mapView.navigator?.volumeLevel = .low

Objective-C

_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;

Buscador de PlaceID

Puedes usar el Buscador de PlaceID para encontrar IDs de lugar que se usarán para los destinos de la ruta. Agrega un destino desde un placeID con GMSNavigationWaypoint.

Texto flotante

Puedes agregar texto flotante en cualquier lugar de tu app, siempre que no se cubra la atribución de Google. El SDK de Navigation no admite anclar el texto a coordenadas específicas (latitud, longitud) en el mapa ni a una etiqueta. Para obtener más información, consulta Ventanas de información.