Siga este guia para traçar uma rota no seu app para um único destino, usando o SDK Navigation para iOS.
Visão geral
- Integre o SDK de navegação 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 passo a passo.- Adicione destinos usando
setDestinations
. - Defina
isGuidanceActive
comotrue
para iniciar o trajeto. - 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?
Pedir as autorizações necessárias ao usuário
Antes de usar o SDK de navegação, o usuário precisa concordar com 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 para autorizar as notificações de alerta de orientação. Esta seção mostra como mostrar as solicitações de autorização necessárias.
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:
- Adicione a chave
NSLocationAlwaysUsageDescription
aInfo.plist
. Para o valor, adicione uma explicação breve sobre por que o app requer serviços de localização. Por exemplo: "Este app precisa de permissão para usar 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 permissão 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 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 viagens 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 a pé, o percurso é representado pela direção para onde 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 evitar
Use as propriedades BOOL
avoidsHighways
e avoidsTolls
para evitar
rodovias e/ou vias com pedágio ao longo de uma rota.
Swift
self.mapView.navigator?.avoidsTolls = true
Objective-C
_mapView.navigator.avoidsTolls = YES;
Localizador de ID do lugar
Use o LocalID Finder para encontrar IDs de lugar para usar nos 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.