Wybierz platformę: Android iOS

Konfigurowanie zakłóceń w czasie rzeczywistym

Zakłócenia w czasie rzeczywistym to zbiór funkcji, które ostrzegają użytkowników o zakłóceniach na trasie i umożliwiają im zgłaszanie i weryfikowanie napotkanych zakłóceń. Przykłady utrudnień to wypadki samochodowe, korki, obecność policji i fotoradarów, roboty drogowe, zamknięte pasy ruchu i niektóre warunki pogodowe. Na tej stronie znajdziesz informacje o funkcjach powiadomień o utrudnieniach w czasie rzeczywistym i ich opcjach konfiguracji, w tym o kwestiach, które należy wziąć pod uwagę w przypadku aplikacji korzystających z niestandardowych interfejsów nawigacji.

Funkcje dotyczące utrudnień w czasie rzeczywistym

Pakiet SDK do nawigacji zawiera te funkcje dotyczące zakłóceń w czasie rzeczywistym, które są częścią podstawowego środowiska nawigacji:

Te funkcje można konfigurować i są one domyślnie włączone. W sekcjach poniżej znajdziesz więcej informacji o funkcjach i dostępnych opcjach konfiguracji.

Interaktywne wywołania dotyczące utrudnień na trasach

Gdy aplikacja wyświetla trasę, w podsumowaniu trasy lub podczas aktywnej nawigacji, wszelkie bieżące utrudnienia pojawiają się jako etykiety wzdłuż trasy. Gdy włączysz warstwę natężenia ruchu, na mapie będą też widoczne utrudnienia poza trasą. Wywołania zawierają ikonę wskazującą typ zakłócenia.

Objaśnienia na trasach

Wyświetlanie objaśnień dotyczących utrudnień na trasach możesz kontrolować za pomocą shouldDisplayPrompts, który kontroluje też wyświetlanie automatycznych alertów, gdy użytkownik zbliża się do utrudnienia.

mapView.navigator.shouldDisplayPrompts = true

Wyświetlanie szczegółów utrudnień, gdy użytkownik kliknie objaśnienie

Kliknięcie powiadomienia o zakłóceniu spowoduje otwarcie karty informacyjnej z dodatkowymi szczegółami. Dotyczy to zarówno objaśnień na trasie, jak i poza nią, przy czym objaśnienia poza trasą pojawiają się tylko wtedy, gdy warstwa ruchu jest włączona. Karta zawiera typ zakłócenia, czas ostatniego zgłoszenia i czasami opcję głosowania, czy zakłócenie nadal występuje. Typ karty informacyjnej i jej opcje konfiguracji różnią się w zależności od tego, czy użytkownik korzysta z aktywnej nawigacji.

Karty informacyjne w przeglądach trasy przed rozpoczęciem aktywnej nawigacji

Przed rozpoczęciem aktywnej nawigacji użytkownicy mogą kliknąć na mapie lub w podsumowaniu trasy wywołanie w trakcie trasy lub poza nią, aby otworzyć kartę informacji. Objaśnienia dotyczące zjechania z trasy wymagają włączenia warstwy ruchu. Karta informacyjna zawiera więcej szczegółów o zakłóceniu.

Karta informacyjna Przegląd

Możesz kontrolować możliwość klikania przez użytkowników objaśnień dotyczących utrudnień w opisach tras, aby wyświetlić więcej informacji, za pomocą metody showsIncidentCards.

mapView.settings.showsIncidentCards = true

Karty informacyjne podczas aktywnej nawigacji

Podczas aktywnej nawigacji użytkownicy mogą kliknąć powiadomienie o utrudnieniach na trasie lub poza nią, aby otworzyć kartę informacyjną. Karta zawiera typ zakłócenia i czas ostatniego zgłoszenia oraz przyciski, za pomocą których użytkownicy mogą głosować, czy zakłócenie nadal występuje.

Głosowanie jest dostępne w przypadku utrudnień na trasie i poza nią w promieniu 5 km od użytkownika, z wyjątkiem zamknięć dróg. Google przetwarza te głosy, aby określić, czy nadal wyświetlać informacje o zakłóceniach. Głosy mogą też pojawiać się na mapie dla innych użytkowników Map Google i pakietu Navigation SDK.

Karta informacyjna aktywnej nawigacji

Możesz kontrolować wyświetlanie i kliknięcia wywołań dotyczących zakłóceń podczas aktywnej nawigacji za pomocą parametru shouldDisplayPrompts, który kontroluje też wyświetlanie wywołań wzdłuż tras i wyświetlanie automatycznych alertów, gdy użytkownik zbliża się do zakłócenia.

mapView.navigator.shouldDisplayPrompts = true

Automatyczne alerty o utrudnieniach z możliwością głosowania podczas aktywnej nawigacji

Gdy użytkownik zbliża się do utrudnienia na trasie podczas aktywnej nawigacji, wyświetla się komunikat z informacjami o utrudnieniu i przyciskami do głosowania, czy utrudnienie nadal występuje. Głosy przesłane przez użytkowników są przetwarzane przez Google i mogą być wyświetlane na mapie innym użytkownikom Map Google i pakietu SDK do nawigacji. Mogą też być wykorzystywane do określania, czy nadal wyświetlać utrudnienie.

Karta informacyjna aktywnej nawigacji

Wyświetlanie alertów podczas aktywnej nawigacji możesz skonfigurować za pomocą metody shouldDisplayPrompts, która kontroluje też wyświetlanie objaśnień na trasach.

mapView.navigator.shouldDisplayPrompts = true
.

Zgłaszanie utrudnień podczas aktywnej nawigacji

W trybie aktywnej nawigacji w interfejsie nawigacji pojawia się przycisk, który umożliwia użytkownikom zgłaszanie nowych utrudnień na trasie. Gdy użytkownik kliknie przycisk, pojawi się menu z dostępnymi typami utrudnień, które można zgłosić. Zgłoszenia przesyłane przez użytkowników są przetwarzane przez Google i mogą być wyświetlane na mapie innym użytkownikom pakietów Google Maps i Navigation SDK.

Przycisk zgłaszania Menu raportowania

Wyświetlanie i ukrywanie przycisku raportowania standardowego

Widoczność standardowego przycisku zgłaszania podczas aktywnej nawigacji możesz skonfigurować za pomocą navigationReportIncidentButtonEnabled.

// Enables the incident reporting FAB to show in situations where incident
// reporting is possible.
mapView.settings.navigationReportIncidentButtonEnabled = true

Dodawanie niestandardowego przycisku zgłaszania

Zamiast standardowego przycisku zgłaszania zakłóceń działania możesz dodać do interfejsu Navigation przycisk niestandardowy. Gdy użytkownik kliknie przycisk niestandardowy, możesz wywołać wyświetlenie menu raportowania, wywołując metodę presentReportIncidentsPanel Przed dodaniem niestandardowego przycisku zgłaszania sprawdź, czy aplikacja jest w aktywnej nawigacji, a użytkownik znajduje się w kraju, w którym zgłaszanie jest włączone. W tym celu wywołaj funkcję reportIncidentsAvailable. Jeśli któryś z tych warunków nie jest spełniony, menu raportowania nie będzie widoczne.

  // Check if reporting is available before displaying your button
  let isReportingAvailable = mapview.isIncidentReportingAvailable()
  customReportingIncidentButton.isHidden = !isReportingAvailable
  customReportingIncidentButton.addTarget(self, action: #selector(didTapReportIncidentButton), for: .touchUpInside)
  
  // Trigger the reporting flow if the button is clicked
  func didTapReportIncidentButton() {
          mapView.presentReportIncidentsPanel(self) { [weak self] error in
              guard let self = self else { return }
              if let error = error as NSError? {
                  if error.domain == GMSMapViewPresentReportIncidentPanelErrorDomain {
                      let errorCode = GMSMapViewPresentReportIncidentPanelErrorCode(rawValue: error.code)
                      
                      switch errorCode {
                      case .internal:
                          self.showErrorMessage(
                              title: "Error Presenting Report Incident Panel",
                              message: "An internal error occurred."
                          )
                      case .reportingNotAvailable:
                          self.showErrorMessage(
                              title: "Error Presenting Report Incident Panel",
                              message: "Reporting is not available."
                          )
                      case .none:
                          self.showErrorMessage(
                              title: "Error Presenting Report Incident Panel",
                              message: "An unknown error occurred."
                          )
                      }
                  } else {
                      // Handle other potential errors (e.g., network errors)
                      self.showErrorMessage(
                          title: "Error Presenting Report Incident Panel",
                          message: "An unexpected error occurred: \(error.localizedDescription)"
                      )
                  }
              }
              // If error is nil, the panel was presented successfully. You can add any extra logic here.
          }
     }

Praca z niestandardowymi interfejsami nawigacji

Jeśli Twoja implementacja pakietu Navigation SDK zawiera niestandardowe elementy interfejsu, musisz wziąć pod uwagę elementy zakłóceń w czasie rzeczywistym, aby uniknąć konfliktów.

Pozycjonowanie przycisku zgłaszania

Domyślnie przycisk zgłaszania zakłóceń jest umieszczony w dolnym rogu mapy – po prawej stronie w przypadku języków pisanych od lewej do prawej i po lewej stronie w przypadku języków pisanych od prawej do lewej. Jeśli musisz przenieść przycisk zgłaszania, aby zrobić miejsce na niestandardowe elementy interfejsu, użyj bottomTrailingButtonsLayoutGuide.

Swift

// Create a new layout guide
let topRightLayoutGuide = UILayoutGuide()
self.view.addLayoutGuide(topRightLayoutGuide)

// Activate constraints using fixed constants here as an example
// assuming the current reporting button is of fixed height
topRightLayoutGuide.topAnchor.constraint(equalTo: _mapView.navigationHeaderLayoutGuide.bottomAnchor, constant: 50).isActive = true
topRightLayoutGuide.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -14).isActive = true

// Assign the layout guide
_mapView.bottomTrailingButtonsLayoutGuide = topRightLayoutGuide

// Create an alternate layout guide to use when the header and the footer are not full width
let topRightAlternateLayoutGuide = UILayoutGuide()
self.view.addLayoutGuide(topRightAlternateLayoutGuide)

// Activate constraints using fixed constants here as an example
// assuming the current RTD button is of fixed height
topRightAlternateLayoutGuide.topAnchor.constraint(equalTo: _mapView.navigationHeaderLayoutGuide.bottomAnchor, constant: 20).isActive = true
topRightAlternateLayoutGuide.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -10).isActive = true

// Assign the layout guide
_mapView.bottomTrailingButtonsAlternateLayoutGuide = topRightAlternateLayoutGuide

Objective-C

// Create a new layout guide
UILayoutGuide *topRightLayoutGuide = [[UILayoutGuide alloc] init];
[self.view addLayoutGuide:topRightLayoutGuide];

// Activate constraints using fixed constants here as an example
// assuming the current RTD button is of fixed height
[[topRightLayoutGuide.topAnchor
    constraintEqualToAnchor:_mapView.navigationHeaderLayoutGuide.bottomAnchor
                   constant:50]
    setActive:YES];

[[topRightLayoutGuide.trailingAnchor
    constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor
                   constant:-14]
    setActive:YES];

// Assign the layout guide
_mapView.bottomTrailingButtonsLayoutGuide = topRightLayoutGuide;

// Create an alternate layout guide to use when the header and the footer are not full width
UILayoutGuide *topRightAlternateLayoutGuide = [[UILayoutGuide alloc] init];
[self.view addLayoutGuide:topRightAlternateLayoutGuide];

// Activate constraints using fixed constants here as an example
// assuming the current RTD button is of fixed height
[[topRightAlternateLayoutGuide.topAnchor
    constraintEqualToAnchor:_mapView.navigationHeaderLayoutGuide.bottomAnchor
                   constant:50]
    setActive:YES];

[[topRightAlternateLayoutGuide.trailingAnchor
    constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor
                   constant:-14]
    setActive:YES];

// Assign the layout guide
_mapView.bottomTrailingButtonsAlternateLayoutGuide = topRightAlternateLayoutGuide;

Prompt Visibility API (eksperymentalny)

Interfejs Prompt Visibility API pomaga uniknąć konfliktów między elementami interfejsu wygenerowanymi przez pakiet Navigation SDK a własnymi elementami interfejsu, dodając odbiornik, który otrzymuje wywołanie zwrotne, zanim pojawi się element interfejsu pakietu Navigation SDK i gdy tylko zostanie on usunięty. Możesz otrzymywać wywołania zwrotne dotyczące elementów zakłóceń w czasie rzeczywistym, w tym kart informacyjnych, promptów i menu zgłaszania zakłóceń, a także innych powiadomień generowanych przez Navigation SDK.

Swift

// Additional methods added to GMSNavigatorListener
...
func navigatorWillPresentPrompt(_ navigator: GMSNavigator) {
  // Hide any sort of custom UI element.
}

func navigatorDidDismissPrompt(_ navigator: GMSNavigator) {
  // Show any sort of custom UI element.
}
...

Objective-C

// Additional methods added to GMSNavigatorListener
...
- (void)navigatorWillPresentPrompt:(GMSNavigator *)navigator {
  // Hide any sort of custom UI element.
}

- (void)navigatorDidDismissPrompt:(GMSNavigator *)navigator {
  // Show any sort of custom UI element.
}
...