Z tego przewodnika dowiesz się, jak za pomocą pakietu Navigation SDK na iOS wyznaczyć w aplikacji trasę do pojedynczego miejsca docelowego.
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 zezwolenie na korzystanie z usług lokalizacyjnych i powiadomień w tle.
- Utwórz tablicę zawierającą co najmniej 1 miejsce docelowe.
Zdefiniuj
GMSNavigator, aby kontrolować szczegółową nawigację.- Dodaj miejsca docelowe za pomocą
setDestinations. - Aby rozpocząć nawigację, ustaw
isGuidanceActivenatrue. - Użyj
simulateLocationsAlongExistingRoute, aby symulować postęp pojazdu na trasie w celu testowania, debugowania i demonstrowania aplikacji.
- Dodaj miejsca docelowe za pomocą
Wyświetl kod
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ż poprosić użytkownika o autoryzację powiadomień o ostrzeżeniach dotyczących wskazówek. W tej sekcji dowiesz się, jak wyświetlać wymagane prośby o autoryzację.
Autoryzowanie usług wykorzystujących lokalizację
Pakiet Navigation SDK korzysta z usług wykorzystujących lokalizację, które wymagają autoryzacji użytkownika. Aby włączyć usługi lokalizacyjne i wyświetlić okno autoryzacji, wykonaj te czynności:
Włącz funkcje lokalizacji i działania w tle w Xcode:
- Otwórz cel w Xcode i wybierz kartę Signing & Capabilities (Podpisywanie i funkcje). Szczegółowe informacje znajdziesz w przewodniku Apple na temat dodawania funkcji do aplikacji.
- Dodaj uprawnienia Lokalizacja (zawsze) i Lokalizacja (podczas używania). W polu tekstowym każdego z nich dodaj krótkie wyjaśnienie, dlaczego aplikacja wymaga usług lokalizacyjnych (np. „Ta aplikacja potrzebuje uprawnień do korzystania z usług lokalizacyjnych, aby wyświetlać szczegółowe wskazówki dojazdu”).
- Dodaj funkcję Tryby działania w tle, a następnie zaznacz pole wyboru Aktualizacje lokalizacji. Bez tej funkcji aplikacja ulega awarii podczas uruchamiania nawigacji. Szczegółowe informacje znajdziesz w przewodniku Apple na temat obsługi informacji o zmianie 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 wykorzystujących lokalizację
Autoryzowanie powiadomień o alertach dotyczących wskazówek w tle
Pakiet Navigation SDK potrzebuje zgody użytkownika, aby wyświetlać powiadomienia, gdy aplikacja działa w tle. Dodaj ten kod, aby poprosić użytkownika o zgodę 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 wersji głównej 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 zgodę.
Dodanie tego klucza nie ma wpływu na bieżące działanie, ale zapobiega awariom inicjowania podczas późniejszego uaktualniania pakietu SDK.
Aby przygotować się na przyszłe uaktualnienia pakietu SDK, skonfiguruj uprawnienia czujnika ruchu w ten sposób:
Otwórz cel w Xcode i przejdź na kartę Informacje lub otwórz plik
Info.plist.Dodaj nowy klucz: Privacy - Motion Usage Description (
NSMotionUsageDescription).Dodaj krótkie wyjaśnienie dla użytkownika. Na przykład: „Ta aplikacja wymaga dostępu do czujnika ruchu, aby obliczać wysokość i poprawiać dokładność wyznaczania trasy na mapie”.
Zaakceptuj warunki korzystania z usługi
Użyj poniższego kodu, aby wyświetlić okno z warunkami i włączyć nawigację, gdy użytkownik zaakceptuje warunki. Zwróć uwagę, że ten przykład zawiera kod usług wykorzystujących lokalizację i powiadomień o ostrzeżeniach dotyczących wskazówek (pokazanych 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 miejsce docelowe GMSNavigationWaypoint, które chcesz odwiedzić. Jeśli trasa zostanie obliczona, pojawi się na mapie. Aby rozpocząć nawigację po trasie, ustaw isGuidanceActive na true w wywołaniu zwrotnym.
W tym przykładzie:
- tworzenie nowej trasy z jednym miejscem docelowym,
- Rozpoczynam nawigację.
- Włączanie powiadomień ze wskazówkami w tle.
- symulowanie podróży po trasie (opcjonalnie).
- Ustawianie 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 kilkoma 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. Możesz ustawić jeden z 4 trybów podróży: samochodem, rowerem, pieszo i taksówką. W trybie jazdy samochodem i taksówką kurs użytkownika jest określany na podstawie kierunku jazdy, a w trybie jazdy na rowerze i chodzenia – na podstawie kierunku, w którym jest skierowane urządzenie (w trybie poziomym – w stronę górnej krawędzi urządzenia).
Ustaw właściwość travelMode widoku mapy, jak w tym przykładzie:
Swift
self.mapView.travelMode = .cycling
Objective-C
_mapView.travelMode = GMSNavigationTravelModeCycling;
Ustawianie dróg, których chcesz unikać
Używaj 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 głosowych
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.
Swift
self.mapView.navigator?.volumeLevel = .low
Objective-C
_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;
Wyszukiwarka identyfikatorów miejsc
Aby znaleźć identyfikatory miejsc, których chcesz użyć jako miejsc docelowych na trasie, możesz skorzystać z wyszukiwarki identyfikatorów miejsc. Dodaj miejsce docelowe z placeID za pomocą GMSNavigationWaypoint.
Tekst pływający
Możesz dodać pływający tekst w dowolnym miejscu w aplikacji, o ile nie zasłania on informacji o autorstwie Google. Pakiet Navigation SDK nie obsługuje zakotwiczania tekstu do określonych współrzędnych (szerokości i długości geograficznej) na mapie ani do etykiety. Więcej informacji znajdziesz w artykule na temat okien informacyjnych.