Poruszanie się po trasie

Z tego przewodnika dowiesz się, jak wyznaczyć w aplikacji trasę do jednego miejsca docelowego za pomocą pakietu Navigation SDK na iOS.

Przegląd

  1. Zintegruj pakiet Navigation SDK z aplikacją zgodnie z opisem w sekcji Konfigurowanie projektu.
  2. Skonfiguruj GMSMapView.
  3. Poproś użytkownika o zaakceptowanie warunków korzystania z usługi oraz o autoryzację usług lokalizacyjnych i powiadomień w tle.
  4. Utwórz tablicę zawierającą co najmniej 1 miejsce docelowe.
  5. Określ GMSNavigator, aby sterować nawigacją zakręt po zakręcie.

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:

  1. Włącz w Xcode funkcje lokalizacji i działania w tle:

    1. 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.
    2. Dodaj funkcje Lokalizacja (zawsze)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”).
    3. 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.
  2. 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:

  1. Otwórz projekt w Xcode i przejdź na kartę Info lub otwórz plik Info.plist.

  2. Dodaj nowy klucz: Privacy - Motion Usage Description (NSMotionUsageDescription).

  3. 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 avoidsHighwaysavoidsTolls 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.