Konfigurowanie utrudnień w czasie rzeczywistym
Utrudnienia w czasie rzeczywistym to zbiór funkcji, które ostrzegają użytkowników o utrudnieniach na trasie oraz umożliwiają im zgłaszanie i weryfikowanie napotkanych utrudnień. 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 związanych z utrudnieniami w czasie rzeczywistym i opcjach ich 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 Navigation SDK obejmuje te funkcje związane z utrudnieniami w czasie rzeczywistym, które są częścią podstawowej nawigacji:- Interaktywne objaśnienia dotyczące utrudnień na trasach.
- Automatyczne alerty o utrudnieniach z głosowaniem podczas aktywnej nawigacji.
- Zgłaszanie utrudnień podczas aktywnej 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 objaśnienia dotyczące utrudnień na trasach
Gdy aplikacja wyświetla trasę, w opisie trasy lub podczas aktywnej nawigacji, wszelkie bieżące zakłócenia są wyświetlane jako objaśnienia na trasie. Gdy włączysz warstwę natężenia ruchu, na mapie będą też widoczne utrudnienia poza trasą. Objaśnienia zawierają ikonę wskazującą typ zakłócenia.
Możesz kontrolować wyświetlanie objaśnień dotyczących utrudnień na trasach 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 objaśnienia dotyczącego utrudnień powoduje 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 włączona jest warstwa ruchu. Na karcie wyświetlany jest typ utrudnienia, czas ostatniego zgłoszenia, a czasami opcja głosowania, czy utrudnienie 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 z objaśnieniami w opisach tras przed rozpoczęciem aktywnej nawigacji;
Przed rozpoczęciem aktywnej nawigacji użytkownicy mogą kliknąć objaśnienie na trasie lub poza nią na mapie albo w opisie trasy, aby otworzyć kartę informacyjną. Objaśnienia dotyczące zjechania z trasy wymagają włączenia warstwy ruchu. Karta informacyjna zawiera więcej informacji o zakłóceniach.
Za pomocą metody showsIncidentCards możesz kontrolować, czy użytkownicy mogą klikać objaśnienia dotyczące utrudnień w opisach tras, aby wyświetlić więcej informacji.
mapView.settings.showsIncidentCards = true
Karty informacyjne z objaśnieniami podczas aktywnej nawigacji
Podczas aktywnej nawigacji użytkownicy mogą kliknąć objaśnienie dotyczące utrudnienia na trasie lub poza nią, aby otworzyć kartę informacyjną. Karta zawiera typ utrudnienia i ostatni zgłoszony czas, a także przyciski, za pomocą których użytkownicy mogą głosować, czy utrudnienie 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 utrudnieniach. Głosy mogą też pojawiać się na mapie dla innych użytkowników Map Google i pakietu Navigation SDK.
Możesz kontrolować wyświetlanie i możliwość klikania objaśnień dotyczących utrudnień podczas aktywnej nawigacji za pomocą metody shouldDisplayPrompts, która kontroluje też wyświetlanie objaśnień na trasach i wyświetlanie automatycznych alertów, gdy użytkownik zbliża się do utrudnienia.
mapView.navigator.shouldDisplayPrompts = true
Automatyczne alerty o utrudnieniach z głosowaniem podczas aktywnej nawigacji
Podczas aktywnej nawigacji, gdy użytkownik zbliża się do utrudnienia na trasie, pojawia 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 pakietu SDK Map Google i pakietu SDK nawigacji, a także służyć do określania, czy nadal wyświetlać utrudnienia.
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 aktywnym trybie 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 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 Map Google i pakietu SDK nawigacji.
Wyświetlanie i ukrywanie przycisku raportowania standardowego
Widoczność przycisku standardowego 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 przycisku raportowania niestandardowego
Zamiast standardowego przycisku zgłaszania utrudnień możesz dodać do interfejsu nawigacji przycisk raportowania niestandardowego. Gdy użytkownik kliknie przycisk niestandardowy, możesz wywołać wyświetlenie menu zgłaszania, wywołując metodę presentReportIncidentsPanel. Zanim dodasz przycisk raportu niestandardowego, sprawdź, czy aplikacja jest w trybie aktywnej nawigacji, a użytkownik znajduje się w kraju, w którym raportowanie jest włączone. Aby to zrobić, wywołaj metodę 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ń znajduje się 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żyjbottomTrailingButtonsLayoutGuide.
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 generowanymi przez pakiet Navigation SDK a własnymi elementami interfejsu. W tym celu dodaje detektor, który odbiera wywołanie zwrotne, zanim element interfejsu pakietu Navigation SDK ma się pojawić i zaraz po jego usunięciu. Możesz otrzymywać wywołania zwrotne dotyczące elementów zakłóceń w czasie rzeczywistym, w tym kart informacyjnych, próśb i menu zgłaszania zakłóceń, a także innych powiadomień generowanych przez pakiet 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. } ...