Siga este guia para traçar uma rota no seu app para um único destino, usando o SDK de navegação 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 que contenha um ou mais destinos.
Defina um
GMSNavigator
para controlar a navegação guiada.- Adicione destinos usando
setDestinations
. - Defina
isGuidanceActive
comotrue
para iniciar a navegação. - Use
simulateLocationsAlongExistingRoute
para simular o progresso do veículo ao longo do trajeto, para testar, depurar e demonstrar seu app.
- Adicione destinos usando
Achou o código?
Solicitar as autorizações necessárias ao usuário
Antes de usar o SDK de navegação, o usuário precisa aceitar os Termos e Condições e autorizar o uso de serviços de localização, o que é necessário para a navegação. Se o app for executado em segundo plano, ele também precisará pedir ao usuário que autorize as notificações de alerta de orientação. Esta seção mostra como mostrar as solicitações de autorização necessárias.
Autorizar serviços de localização
O SDK de navegação 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 a chave
NSLocationAlwaysUsageDescription
aInfo.plist
. Para o valor, adicione uma breve explicação de por que o app precisa de serviços de localização. Por exemplo: "Este app precisa de permissão para usar os serviços de localização para navegação passo a passo".
Para mostrar a caixa de diálogo de autorização, chame
requestAlwaysAuthorization()
da instância do gerenciador de local.
Swift
self.locationManager.requestAlwaysAuthorization()
Objective-C
[_locationManager requestAlwaysAuthorization];
Autorizar notificações de alerta para orientação em segundo plano
O SDK de navegação precisa da permissão do usuário para enviar notificações de alerta quando o app está em execução em segundo plano. Adicione o código abaixo para solicitar ao usuário a permissão de exibir 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 abaixo 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 (mostrado 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
que contenha um ou mais destinos (GMSNavigationWaypoint
) a serem visitados. Se o cálculo for bem-sucedido, o trajeto vai aparecer no mapa. Para iniciar a orientação ao longo do trajeto,
começando pelo primeiro destino, defina isGuidanceActive
como true
no
callback.
O exemplo abaixo mostra:
- Criação de uma nova rota com dois destinos.
- Iniciando a orientação.
- Ativar as notificações de orientação em segundo plano.
- Simular a viagem ao longo do 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")!)
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 saber mais sobre os IDs de lugar, consulte IDs de lugar.
Escolher meio de transporte
O modo de viagem determina qual tipo de rota será buscado e como o percurso do usuário é determinado. É possível definir um dos quatro modos de transporte para uma rota: carro, bicicleta, a pé e táxi. No modo de carro e táxi, o percurso do usuário é baseado na direção da viagem. No modo de bicicleta e caminhada, o percurso é representado pela direção para a qual o dispositivo está virado.
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 BOOL
avoidsHighways
e avoidsTolls
para evitar rodovias e/ou vias com pedágio ao longo de um trajeto.
Swift
self.mapView.navigator?.avoidsTolls = true
Objective-C
_mapView.navigator.avoidsTolls = YES;
Localizador de ID do lugar
Use o LocalID Finder
para encontrar os IDs de lugar a serem usados para destinos de trajeto. 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 SDK de navegação 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.