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 zakłóceń to wypadki samochodowe, korki, obecność policji i fotoradarów, roboty drogowe, zamknięcia pasów ruchu i określone warunki pogodowe. Na tej stronie opisano funkcje zakłóceń w czasie rzeczywistym i ich opcje konfiguracji, w tym kwestie dotyczące aplikacji, które używają niestandardowych interfejsów nawigacji.

Funkcje zakłóceń w czasie rzeczywistym

Navigation SDK zawiera te funkcje zakłóceń w czasie rzeczywistym jako część podstawowej nawigacji:

Te funkcje są konfigurowalne i domyślnie włączone. Więcej informacji o funkcjach i dostępnych opcjach konfiguracji znajdziesz w kolejnych sekcjach.

Interaktywne komunikaty o zakłóceniach na trasach

Gdy aplikacja wyświetla trasę, w widoku ogólnym trasy lub podczas aktywnej nawigacji, wszelkie bieżące zakłócenia są wyświetlane jako komunikaty na trasie. Komunikaty zawierają ikonę wskazującą typ zakłócenia.

Objaśnienia na trasach

Wyświetlanie komunikatów o zakłóceniach na trasach możesz kontrolować za pomocą parametru shouldDisplayPrompts, który kontroluje też wyświetlanie automatycznych alertów, gdy użytkownik zbliża się do zakłócenia.

mapView.navigator.shouldDisplayPrompts = true

Wyświetlanie szczegółów zakłócenia, gdy użytkownik kliknie komunikat

Użytkownicy mogą kliknąć objaśnienie, aby wyświetlić kartę informacyjną z dodatkowymi informacjami o zakłóceniu, w tym o jego typie, czasie ostatniego zgłoszenia oraz, w niektórych przypadkach, opcją głosowania, czy zakłócenie nadal występuje. W zależności od tego, czy użytkownik korzysta z aktywnej nawigacji, mogą się pojawić 2 różne typy kart informacyjnych , a opcje konfiguracji różnią się w zależności od typu.

Karty informacyjne w widokach ogólnych trasy przed rozpoczęciem aktywnej nawigacji

Gdy użytkownik kliknie komunikat w opisie trasy przed rozpoczęciem aktywnej nawigacji, pojawi się karta informacyjna z dodatkowymi informacjami o zakłóceniu.

Karta informacyjna Przegląd

Możesz kontrolować możliwość klikania przez użytkowników komunikatów o zakłóceniach w widokach ogólnych trasy, aby wyświetlać więcej informacji za pomocą showsIncidentCards.

mapView.settings.showsIncidentCards = true

Karty informacyjne podczas aktywnej nawigacji

Gdy podczas aktywnej nawigacji na trasie pojawi się komunikat o zakłóceniu, użytkownicy mogą go kliknąć, aby wyświetlić kartę informacyjną z dodatkowymi informacjami o zakłóceniu, w tym o jego typie i czasie ostatniego zgłoszenia, a także przyciski do głosowania, czy zakłócenie 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 Navigation SDK, a także służyć do określania, czy zakłócenie ma być nadal wyświetlane.

Karta informacji o aktywnej nawigacji

Wyświetlanie i możliwość klikania komunikatów o zakłóceniach podczas aktywnej nawigacji możesz kontrolować za pomocą shouldDisplayPrompts, który kontroluje też wyświetlanie komunikatów na trasach i wyświetlanie automatycznych alertów, gdy użytkownik zbliża się do zakłócenia.

mapView.navigator.shouldDisplayPrompts = true

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

Podczas aktywnej nawigacji, gdy użytkownik zbliża się do zakłócenia na trasie, pojawia się prośba z informacjami o zakłóceniu i przyciskami do głosowania, czy zakłócenie 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 Navigation SDK , a także służyć do określania, czy zakłócenie ma być nadal wyświetlane.

Karta informacji o aktywnej nawigacji

Wyświetlanie alertów podczas aktywnej nawigacji możesz skonfigurować za pomocą shouldDisplayPrompts, który kontroluje też wyświetlanie komunikatów na trasach.

mapView.navigator.shouldDisplayPrompts = true

Zgłaszanie zakłóceń podczas aktywnej nawigacji

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

Przycisk raportowania Menu raportowania

Wyświetlanie i ukrywanie standardowego przycisku zgłaszania

Widoczność standardowego przycisku zgłaszania podczas aktywnej nawigacji możesz skonfigurować za pomocą parametru 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 niestandardowy przycisk zgłaszania. Gdy użytkownik kliknie przycisk niestandardowy, możesz wywołać wyświetlenie menu zgłaszania, wywołując metodę presentReportIncidentsPanel. Zanim dodasz niestandardowy przycisk zgłaszania, sprawdź, czy aplikacja jest w trybie aktywnej nawigacji, a użytkownik znajduje się w kraju, w którym zgłaszanie jest włączone, wywołując metodę reportIncidentsAvailable. Jeśli którykolwiek z tych warunków nie jest spełniony, menu zgłaszania się nie pojawi.

  // 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 implementacja Navigation SDK zawiera niestandardowe elementy interfejsu, musisz wziąć pod uwagę elementy zakłóceń w czasie rzeczywistym, aby uniknąć konfliktów.

Położenie przycisku zgłaszania

Domyślnie przycisk zgłaszania zakłóceń jest umieszczony w prawym dolnym rogu mapy w przypadku języków pisanych od lewej do prawej i w lewym dolnym rogu 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 parametru 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)

Prompt Visibility API pomaga unikać konfliktów między elementami interfejsu generowanymi przez Navigation SDK a własnymi elementami niestandardowymi, dodając odbiornik, który będzie otrzymywać wywołanie zwrotne, zanim pojawi się element interfejsu Navigation SDK i gdy tylko element zostanie usunięty. Możesz otrzymywać wywołania zwrotne dotyczące elementów zakłóceń w czasie rzeczywistym, w tym kart informacyjnych, alertó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.
}
...