Z tego przewodnika dowiesz się, jak wyznaczyć trasę w aplikacji 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 a
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 sterować nawigacją krok po kroku.- Dodaj miejsca docelowe za pomocą
setDestinations. - Ustaw
isGuidanceActivenatrue, aby rozpocząć nawigację. - Użyj
simulateLocationsAlongExistingRoute, aby symulować postęp pojazdu na trasie na potrzeby testowania, debugowania i prezentowania aplikacji.
- Dodaj miejsca docelowe za pomocą
Zobacz kod
Poproś użytkownika o niezbędne autoryzacje
Zanim użytkownik zacznie korzystać z pakietu Navigation SDK, 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 zezwolenie na powiadomienia o alertach nawigacyjnych. W tej sekcji dowiesz się, jak wyświetlać wymagane prośby o autoryzację.
Zezwalanie na korzystanie z 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 autoryzacji, wykonaj te czynności:
Włącz w Xcode funkcje lokalizacji i działania w tle:
- Otwórz cel w Xcode i wybierz kartę Signing &Capabilities (Podpisywanie i funkcje). Więcej informacji znajdziesz w przewodniku Apple na temat dodawania funkcji do aplikacji.
- Dodaj funkcje Location (Always) (Lokalizacja (zawsze)) i Location (When In Use) (Lokalizacja (gdy używam programu)). W polu tekstowym każdej z nich dodaj krótkie wyjaśnienie, dlaczego aplikacja wymaga usług lokalizacyjnych (np. „Ta aplikacja potrzebuje uprawnień do korzystania z usług lokalizacyjnych na potrzeby nawigacji krok po kroku”).
- Dodaj funkcję Background Modes (Tryby działania w tle), a następnie zaznacz pole wyboru Location updates (Aktualizacje lokalizacji). Bez tej funkcji aplikacja ulega awarii podczas rozpoczynania nawigacji. Więcej informacji znajdziesz w przewodniku Apple na temat obsługi aktualizacji lokalizacji w tle.
Aby wyświetlić okno autoryzacji, wywołaj
requestAlwaysAuthorization()metodę instancji menedżera lokalizacji.
Swift
self.locationManager.requestAlwaysAuthorization()
Objective-C
[_locationManager requestAlwaysAuthorization];
Pełną dokumentację Apple dotyczącą autoryzacji usług lokalizacyjnych znajdziesz tutaj.
Zezwalanie na powiadomienia o alertach nawigacyjnych w tle
Pakiet Navigation SDK potrzebuje zgody użytkownika na wysyłanie powiadomień o alertach, gdy aplikacja działa w tle. Aby poprosić użytkownika o zgodę na wyświetlanie tych powiadomień, dodaj ten kod:
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");
}
}];
Zezwalanie na dostęp do czujników ruchu
W przyszłej wersji głównej pakiet Navigation SDK na iOS będzie łączyć podstawowe dane o lokalizacji z czujnikami ruchu urządzenia (CMAltimeter), aby obliczać wysokość trasy. Gdy pakiet SDK uzyska dostęp do wysokościomierza, iOS automatycznie użyje tego ciągu znaków, aby poprosić użytkownika o zgodę.
Dodanie tego klucza teraz nie ma wpływu na bieżące działanie, ale zapobiega awariom podczas inicjowania, gdy później zaktualizujesz pakiet SDK.
Aby przygotować się na przyszłe aktualizacje pakietu SDK, skonfiguruj autoryzacje czujników ruchu w ten sposób:
Otwórz cel w Xcode i przejdź do karty Info (Informacje) lub otwórz plik
Info.plist.Dodaj nowy klucz: Privacy – Motion Usage Description (Prywatność – opis użycia ruchu) (
NSMotionUsageDescription).Dodaj krótkie wyjaśnienie dla użytkownika. Na przykład: „Ta aplikacja wymaga dostępu do czujników ruchu, aby obliczać wysokość i zwiększać dokładność wyznaczania trasy na mapie”.
Zaakceptuj warunki korzystania z usługi
Użyj tego kodu, aby wyświetlić okno z warunkami korzystania z usługi i włączyć nawigację, gdy użytkownik zaakceptuje te warunki. Pamiętaj, że ten przykład zawiera kod usług lokalizacyjnych i powiadomień o alertach nawigacyjnych (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 prawidłowo, 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;
- rozpoczynanie nawigacji;
- włączanie powiadomień o nawigacji 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 wieloma przystankami
Możesz skonfigurować maksymalnie 25 punktów na trasie.
Metoda setDestinations nie obsługuje podróży z wieloma przystankami. Aby przejść do następnego etapu podróży, użyj
continueToNextDestinationWithCompletion().
Wybierz środek transportu
Tryb podróży określa zarówno typ trasy, którą należy pobrać, jak i sposób określania kursu użytkownika. Możesz ustawić jeden z 4 trybów podróży: 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. W trybie jazdy na rowerze i pieszo kurs jest reprezentowany przez kierunek, w którym skierowane jest 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 należy unikać
Użyj właściwości BOOL avoidsHighways i avoidsTolls, aby unikać autostrad, dróg płatnych lub obu tych typów dróg na trasie.
Swift
self.mapView.navigator?.avoidsTolls = true
Objective-C
_mapView.navigator.avoidsTolls = YES;
Ustawianie głośności nawigacji głosowej
Aby dostosować głośność wskazówek głosowych, ustaw właściwość volumeLevel nawigatora na low, normal lub high. Nawigator używa ostatniego zapisanego poziomu głośności lub domyślnie ustawia poziom normal.
Swift
self.mapView.navigator?.volumeLevel = .low
Objective-C
_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;
Wyszukiwarka identyfikatorów miejsc
Za pomocą wyszukiwarki identyfikatorów miejsc
możesz znaleźć identyfikatory miejsc, których możesz użyć jako miejsc docelowych na trasie. Dodaj miejsce docelowe z a
placeID za pomocą GMSNavigationWaypoint.
Pływający tekst
Pływający tekst możesz dodać w dowolnym miejscu aplikacji, o ile nie zasłania on informacji o 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 sekcji Okna informacyjne.