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
- Integra el SDK de Navigation en tu app, como se describe en la sección Configura tu proyecto.
- Configura un
GMSMapView. - 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.
- Crea un array que contenga uno o más destinos.
Define un
GMSNavigatorpara controlar la navegación paso a paso.- Agrega destinos con
setDestinations. - Establece
isGuidanceActiveentruepara iniciar la navegación. - Usa
simulateLocationsAlongExistingRoutepara simular el progreso del vehículo a lo largo de la ruta para probar, depurar y demostrar tu app.
- Agrega destinos con
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 ejecuta en segundo plano, también debe solicitarle al usuario que autorice las notificaciones de alerta de orientación. 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 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:
- Agrega las claves
NSLocationWhenInUseUsageDescriptionyNSLocationAlwaysAndWhenInUseUsageaInfo.plist. Para el valor, 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".
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];
Autoriza las notificaciones de alerta para la orientación 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");
}
}];
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 orientación (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 la orientación
Para trazar una ruta, llama al método setDestinations() del navegador con un array
uno o más destinos
(GMSNavigationWaypoint)
para visitar. Si se calcula correctamente, la ruta se muestra en el mapa. Para iniciar la orientación a lo largo de la ruta, establece isGuidanceActive en true en la devolución de llamada.
En el ejemplo siguiente:
- Cómo crear una ruta nueva con un destino
- Cómo iniciar la orientación
- Cómo habilitar las notificaciones de orientación en segundo plano
- Cómo simular el viaje a lo largo de la ruta (opcional)
- Cómo establecer 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 de varias paradas. Usa continueToNextDestination() para avanzar el punto de ruta a la siguiente etapa del viaje.
Definir medio de viaje
El modo de viaje determina qué tipo de ruta se recuperará y la forma en que se determina el curso 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 curso del usuario se basa en la dirección del viaje; en el modo de ciclismo y caminata, el curso se representa mediante la dirección hacia la que mira 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 o rutas de peaje a lo largo de una ruta.
Swift
self.mapView.navigator?.avoidsTolls = true
Objective-C
_mapView.navigator.avoidsTolls = YES;
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 y cuando no se cubra 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.