Siga este guia para traçar uma rota no seu app até um único destino usando o SDK Navigation para iOS.
Visão geral
- Integre o SDK Navigation ao seu app, conforme descrito na seção Configurar seu 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 com um ou mais destinos.
Defina um
GMSNavigatorpara controlar a navegação guiada.- Adicione destinos usando
setDestinations. - Defina
isGuidanceActivecomotruepara iniciar o trajeto. - Use
simulateLocationsAlongExistingRoutepara simular o progresso do veículo ao longo da rota, para testes, depuração e demonstração do app.
- Adicione destinos usando
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 pedidos 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:
Ative os recursos de localização e segundo plano no Xcode:
- Abra seu destino no Xcode e selecione a guia Assinatura e recursos. Para mais detalhes, consulte o guia da Apple sobre como adicionar recursos ao seu app.
- Adicione os recursos Localização (sempre) e Localização (durante o uso). No campo de texto de cada um, adicione uma breve explicação de por que o app precisa dos serviços de localização (por exemplo: "Este app precisa de permissão para usar os serviços de localização na navegação trecho a trecho").
- Adicione o recurso Modos em segundo plano e marque a caixa de seleção Atualizações de localização. Sem esse recurso, o app falha ao iniciar a navegação. Para mais detalhes, consulte o guia da Apple sobre como processar atualizações de localização em segundo plano.
Para mostrar a caixa de diálogo de autorização, chame o método
requestAlwaysAuthorization()da instância do gerenciador de locais.
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 SDK Navigation 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");
}
}];
Autorizar sensores de movimento
Em uma futura versão principal, o SDK Navigation para iOS vai combinar dados de localização principais com sensores de movimento do dispositivo (CMAltimeter) para calcular a altitude do trajeto. Quando o SDK acessa o altímetro, o iOS usa automaticamente essa string para pedir permissão ao usuário.
Adicionar essa chave agora não tem impacto no comportamento atual, mas evita falhas de inicialização quando você fizer upgrade do SDK mais tarde.
Para se preparar para upgrades futuros do SDK, configure as autorizações do sensor de movimento da seguinte maneira:
Abra seu destino no Xcode e navegue até a guia Informações ou abra o arquivo
Info.plist.Adicione uma nova chave: Privacy - Motion Usage Description (
NSMotionUsageDescription).Adicione uma breve explicação para o usuário. Por exemplo: "Este app exige acesso ao sensor de movimento para calcular a altitude e melhorar a precisão do trajeto no mapa".
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 um trajeto e iniciar a navegaçã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 a rota for calculada com sucesso, ela vai aparecer no mapa. Para iniciar a orientação ao longo do trajeto, defina isGuidanceActive como true no
callback.
O exemplo abaixo mostra:
- Criar uma nova rota com um destino.
- 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")!)
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 lugar, consulte IDs de lugar.
Cenários com várias paradas
É possível configurar até 25 paradas.
O método setDestinations não é compatível com viagens com várias paradas. Use
continueToNextDestinationWithCompletion()
para avançar o ponto de referência até a próxima etapa da viagem.
Escolher meio de transporte
O modo de viagem define o tipo de trajeto a ser buscado e como determinar o curso do usuário. É 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 curso do usuário é baseado na direção do trajeto. Nos modos de bicicleta e a pé, o curso é representado pela direção em que o dispositivo está apontando (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 serem evitadas
Use as propriedades avoidsHighways e avoidsTolls BOOL para evitar
rodovias, pedágios ou ambos em um trajeto.
Swift
self.mapView.navigator?.avoidsTolls = true
Objective-C
_mapView.navigator.avoidsTolls = YES;
Definir o volume da orientação por áudio
Para ajustar o volume da orientação por voz, defina a propriedade volumeLevel no
navegador como baixo, normal ou alto. O navegador usa o último nível de volume persistente ou o padrão.
Swift
self.mapView.navigator?.volumeLevel = .low
Objective-C
_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;
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 em coordenadas específicas (latitude, longitude) no mapa ou em um rótulo. Para mais informações, consulte Janelas de informações.