Siga este guia para traçar uma rota no seu app até um único destino usando o Navigation SDK for iOS.
Visão geral
- Integre o Navigation SDK ao seu app, conforme descrito na seção Configurar o projeto.
- Configure um
GMSMapView. - 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.
- Crie uma matriz contendo um ou mais destinos.
Defina um
GMSNavigatorpara controlar a navegação guiada.- Adicione destinos usando
setDestinations. - Defina
isGuidanceActivecomotruepara iniciar a navegação. - Use
simulateLocationsAlongExistingRoutepara simular o progresso do veículo ao longo da rota para testes, depuração e demonstração do seu app.
- Adicione destinos usando
Achou o código?
Solicitar as autorizações necessárias ao usuário
Antes de usar o Navigation SDK, 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 serviços de localização
O Navigation SDK 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:
- Adicione as chaves
NSLocationWhenInUseUsageDescriptioneNSLocationAlwaysAndWhenInUseUsageaoInfo.plist. Para o valor, adicione uma breve explicação de por que o app exige serviços de localização. Por exemplo: "Este app precisa de permissão para usar Serviços de localização para navegação guiada."
Para exibir a caixa de diálogo de autorização, chame o
requestAlwaysAuthorization()método da instância do gerenciador de localização.
Swift
self.locationManager.requestAlwaysAuthorization()
Objective-C
[_locationManager requestAlwaysAuthorization];
Consulte a documentação completa da Apple sobre a autorização do serviço de localização.
Autorizar notificações de alerta para orientação em segundo plano
O Navigation SDK precisa da permissão do usuário para fornecer 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 dos 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 (mostrados 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
de um ou mais destinos
(GMSNavigationWaypoint)
a serem visitados. Se for calculada com sucesso, a rota será mostrada no mapa. Para iniciar a orientação ao longo da rota, defina isGuidanceActive como true no callback.
O exemplo abaixo mostra:
- Como criar uma nova rota com um destino.
- Como iniciar a orientação.
- Como ativar as notificações de orientação em segundo plano.
- Como simular viagens ao longo da rota (opcional).
- Como 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")!)
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 saber mais sobre IDs de local, consulte IDs de local.
Cenários com várias paradas
É possível configurar um máximo de 25 paradas.
O método setDestinations não oferece suporte a viagens com várias paradas. Use continueToNextDestination() para avançar o waypoint para a próxima etapa da jornada.
Escolher meio de transporte
O modo de viagem determina qual tipo de rota será buscado e a maneira como o curso do usuário é determinado. É possível definir um dos quatro modos de viagem para uma rota: carro, bicicleta, caminhada e táxi. No modo de carro e táxi, o curso do usuário é baseado na direção da viagem. No modo de bicicleta e caminhada, o curso é representado pela direção para a qual o dispositivo está voltado (para a parte de cima do dispositivo no modo paisagem).
Defina a travelMode
propriedade da visualização do mapa, conforme mostrado no exemplo a seguir:
Swift
self.mapView.travelMode = .cycling
Objective-C
_mapView.travelMode = GMSNavigationTravelModeCycling;
Definir estradas a serem evitadas
Use as propriedades avoidsHighways e avoidsTolls BOOL para evitar rodovias e/ou estradas com pedágio ao longo de 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 local a serem usados para destinos de rota. 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 Navigation SDK 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.