Z tego przewodnika dowiesz się, jak wyznaczyć w aplikacji trasę do jednego miejsca docelowego za pomocą pakietu Navigation SDK na iOS.
Przegląd
- Zintegruj pakiet Navigation SDK z aplikacją zgodnie z opisem w sekcji Konfigurowanie projektu.
- Skonfiguruj
GMSMapView. - Poproś użytkownika o zaakceptowanie warunków korzystania z usługi oraz o autoryzację usług lokalizacyjnych i powiadomień w tle.
- Utwórz tablicę zawierającą co najmniej 1 miejsce docelowe.
Określ
GMSNavigator, aby sterować nawigacją zakręt po zakręcie.- Dodaj miejsca docelowe za pomocą ikony
setDestinations. - Ustaw
isGuidanceActivenatrue, aby rozpocząć nawigację. - Użyj
simulateLocationsAlongExistingRoute, aby symulować postępy pojazdu na trasie na potrzeby testowania, debugowania i demonstrowania aplikacji.
- Dodaj miejsca docelowe za pomocą ikony
Wyświetlanie kodu
Poproś użytkownika o niezbędne autoryzacje.
Przed użyciem pakietu Navigation SDK użytkownik musi zaakceptować warunki korzystania z usługi i zezwolić na korzystanie z usług lokalizacyjnych, które są wymagane do nawigacji. Jeśli aplikacja będzie działać w tle, musi też wyświetlać prośbę o zezwolenie na powiadomienia z alertami dotyczącymi wskazówek. W tej sekcji dowiesz się, jak wyświetlać wymagane prośby o autoryzację.
Autoryzowanie usług lokalizacyjnych
Pakiet Navigation SDK korzysta z usług lokalizacyjnych, które wymagają autoryzacji użytkownika. Aby włączyć usługi lokalizacyjne i wyświetlić okno dialogowe autoryzacji, wykonaj te czynności:
Włącz w Xcode funkcje lokalizacji i działania w tle:
- Otwórz projekt w Xcode i wybierz kartę Podpisywanie i możliwości. Szczegółowe informacje znajdziesz w przewodniku Apple na temat dodawania funkcji do aplikacji.
- Dodaj funkcje Lokalizacja (zawsze) i Lokalizacja (podczas używania). W polu tekstowym każdego z nich dodaj krótkie wyjaśnienie, dlaczego Twoja aplikacja wymaga usług lokalizacyjnych (np. „Ta aplikacja potrzebuje uprawnień do korzystania z usług lokalizacyjnych w celu nawigacji krok po kroku”).
- Dodaj funkcję Background Modes, a następnie zaznacz pole wyboru Location updates (Aktualizacje lokalizacji). Bez tej funkcji aplikacja ulega awarii podczas rozpoczynania nawigacji. Szczegółowe informacje znajdziesz w przewodniku Apple na temat obsługi aktualizacji lokalizacji w tle.
Aby wyświetlić okno autoryzacji, wywołaj metodę
requestAlwaysAuthorization()instancji menedżera lokalizacji.
Swift
self.locationManager.requestAlwaysAuthorization()
Objective-C
[_locationManager requestAlwaysAuthorization];
Zobacz pełną dokumentację Apple dotyczącą autoryzacji usług lokalizacyjnych
Autoryzowanie powiadomień o alertach w przypadku wskazówek w tle
Pakiet Navigation SDK potrzebuje zgody użytkownika na wyświetlanie alertów, gdy aplikacja działa w tle. Dodaj ten kod, aby poprosić użytkownika o zezwolenie na wyświetlanie tych powiadomień:
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");
}
}];
Autoryzowanie czujników ruchu
W przyszłej głównej wersji pakiet SDK do nawigacji na iOS będzie łączyć podstawowe dane o lokalizacji z danymi z czujników ruchu urządzenia (CMAltimeter), aby obliczać wysokość trasy. Gdy pakiet SDK uzyskuje dostęp do wysokościomierza, iOS automatycznie używa tego ciągu znaków, aby poprosić użytkownika o przyznanie uprawnień.
Dodanie tego klucza teraz nie ma wpływu na obecne działanie, ale zapobiega awariom inicjowania podczas późniejszego uaktualniania pakietu SDK.
Aby przygotować się na przyszłe aktualizacje pakietu SDK, skonfiguruj autoryzacje czujnika ruchu w ten sposób:
Otwórz projekt w Xcode i przejdź na kartę Info lub otwórz plik
Info.plist.Dodaj nowy klucz: Privacy - Motion Usage Description (
NSMotionUsageDescription).Dodaj krótkie wyjaśnienie dla użytkownika. Przykład: „Ta aplikacja wymaga dostępu do czujnika ruchu, aby obliczać wysokość i zwiększać dokładność wyznaczania tras na mapie”.
Zaakceptuj warunki korzystania z usługi
Użyj tego kodu, aby wyświetlić okno z warunkami i umożliwić nawigację, gdy użytkownik zaakceptuje warunki. Pamiętaj, że ten przykład zawiera kod usług lokalizacyjnych i powiadomień o alertach dotyczących wskazówek (pokazany wcześniej).
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.
}
}];
Tworzenie trasy i rozpoczynanie nawigacji
Aby wyznaczyć trasę, wywołaj metodę setDestinations nawigatora z tablicą zawierającą co najmniej 1 GMSNavigationWaypoint miejsce docelowe. Jeśli trasa zostanie obliczona, pojawi się na mapie. Aby rozpocząć nawigację po trasie, ustaw w wywołaniu zwrotnym wartość isGuidanceActive na true.
Poniższy przykład pokazuje:
- Tworzenie nowej trasy z 1 miejscem docelowym.
- Rozpoczynam nawigację.
- Włączanie powiadomień z instrukcjami w tle.
- Symulowanie podróży wzdłuż trasy (opcjonalnie).
- Ustawienie trybu kamery na „śledzenie” (opcjonalnie).
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;
}];
}
Więcej informacji o identyfikatorach miejsc znajdziesz w artykule Identyfikatory miejsc.
Scenariusze z wieloma przystankami
Możesz skonfigurować maksymalnie 25 punktów pośrednich.
Metoda setDestinations nie obsługuje podróży z wieloma przystankami. Użyj
continueToNextDestinationWithCompletion()
aby przejść do następnego etapu podróży.
Wybierz środek transportu
Tryb podróży określa zarówno typ trasy do pobrania, jak i sposób określania kursu użytkownika. Dla trasy możesz ustawić jeden z 4 rodzajów transportu: samochód, rower, pieszo i taksówka. W trybie jazdy samochodem i taksówką kurs użytkownika jest określany na podstawie kierunku podróży, a w trybie jazdy na rowerze i chodzenia – na podstawie kierunku, w którym jest skierowane urządzenie (w trybie poziomym – w górę urządzenia).
Ustaw właściwość travelMode widoku mapy, jak pokazano w tym przykładzie:
Swift
self.mapView.travelMode = .cycling
Objective-C
_mapView.travelMode = GMSNavigationTravelModeCycling;
Ustawianie dróg, których chcesz unikać
Użyj właściwości avoidsHighways i avoidsTolls BOOL, aby unikać autostrad, dróg płatnych lub obu tych rodzajów dróg na trasie.
Swift
self.mapView.navigator?.avoidsTolls = true
Objective-C
_mapView.navigator.avoidsTolls = YES;
Ustawianie głośności wskazówek audio
Aby dostosować głośność wskazówek głosowych, ustaw właściwość volumeLevel w nawigatorze na niską, normalną lub wysoką. Nawigator używa ostatniego zapisanego poziomu głośności lub domyślnie ustawia normalny poziom.
Swift
self.mapView.navigator?.volumeLevel = .low
Objective-C
_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;
Wyszukiwarka identyfikatorów miejsc
Aby znaleźć identyfikatory miejsc, które możesz wykorzystać jako miejsca docelowe na trasie, użyj wyszukiwarki identyfikatorów miejsc. Dodaj miejsce docelowe z placeID za pomocą GMSNavigationWaypoint.
Pływający tekst
Pływający tekst możesz dodać w dowolnym miejscu w aplikacji, o ile nie zasłania on informacji o atrybucji Google. Navigation SDK nie obsługuje przypinania tekstu do określonych współrzędnych (szerokości i długości geograficznej) na mapie ani do etykiety. Więcej informacji znajdziesz w sekcji Okna informacji.