Konfigurowanie utrudnień w czasie rzeczywistym
Utrudnienia w czasie rzeczywistym to zbiór funkcji, które ostrzegają użytkowników o utrudnieniach na trasie i umożliwiają im zgłaszanie oraz weryfikowanie napotkanych utrudnień. Przykłady utrudnień to wypadki drogowe, korki, obecność policji i fotoradarów, roboty drogowe, zamknięcia pasów ruchu i określone warunki pogodowe. Na tej stronie opisujemy funkcje utrudnień w czasie rzeczywistym i ich opcje konfiguracji, w tym kwestie dotyczące aplikacji, które używają niestandardowych interfejsów nawigacji.
Funkcje utrudnień w czasie rzeczywistym
Navigation SDK zawiera te funkcje utrudnień w czasie rzeczywistym jako część podstawowej nawigacji:- Interaktywne powiadomienia o utrudnieniach na trasach.
- Automatyczne alerty o utrudnieniach z możliwością głosowania podczas aktywnej nawigacji.
- Zgłaszanie utrudnień podczas aktywnej nawigacji.
Te funkcje można skonfigurować i są domyślnie włączone. Więcej informacji o funkcjach i dostępnych opcjach konfiguracji znajdziesz w kolejnych sekcjach.
Interaktywne powiadomienia o utrudnieniach na trasach
Gdy aplikacja wyświetla trasę, w widoku ogólnym trasy lub podczas aktywnej nawigacji, wszelkie bieżące utrudnienia pojawiają się jako powiadomienia na trasie. Gdy włączysz warstwę ruchu, utrudnienia poza trasą też będą widoczne na mapie. Powiadomienia zawierają ikonę wskazującą typ utrudnienia.
Wyświetlanie powiadomień o utrudnieniach 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 utrudnienia.
mapView.navigator.shouldDisplayPrompts = true
Wyświetlanie szczegółów utrudnienia, gdy użytkownik kliknie powiadomienie
Kliknięcie powiadomienia o utrudnieniu otwiera kartę informacyjną z dodatkowymi szczegółami. Dotyczy to zarówno powiadomień na trasie, jak i poza nią, ale te drugie pojawiają się tylko wtedy, gdy jest włączona warstwa ruchu. Na karcie wyświetla się 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 w widokach ogólnych trasy przed rozpoczęciem aktywnej nawigacji
Zanim użytkownicy rozpoczną aktywną nawigację, mogą kliknąć powiadomienie o utrudnieniu na trasie lub poza nią na mapie albo w widoku ogólnym trasy, aby otworzyć kartę informacyjną. Powiadomienia o utrudnieniach poza trasą wymagają włączenia warstwy ruchu. Karta informacyjna zawiera więcej szczegółów o utrudnieniu.
Możesz kontrolować, czy użytkownicy mogą klikać powiadomienia o utrudnieniach w widokach ogólnych trasy, aby wyświetlać więcej
informacji za pomocą
showsIncidentCards.
mapView.settings.showsIncidentCards = true
Karty informacyjne podczas aktywnej nawigacji
Podczas aktywnej nawigacji użytkownicy mogą kliknąć powiadomienie o utrudnieniu na trasie lub poza nią, aby otworzyć kartę informacyjną. Na karcie wyświetla się typ utrudnienia i czas ostatniego zgłoszenia, 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 wyłączeniem zamknięć dróg. Google przetwarza te głosy, aby określić, czy utrudnienie ma być nadal wyświetlane. Głosy mogą też być widoczne na mapie dla innych użytkowników Map Google i Navigation SDK.
Wyświetlanie i możliwość klikania powiadomień o utrudnieniach podczas aktywnej nawigacji możesz kontrolować za pomocą
shouldDisplayPrompts, który kontroluje też
wyświetlanie powiadomień 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 możliwością głosowania podczas aktywnej nawigacji
Podczas aktywnej nawigacji, gdy użytkownik zbliża się do utrudnienia na trasie, pojawia się prośba 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 dla innych użytkowników Map Google i Navigation SDK, a także służyć do określania, czy utrudnienie ma być nadal wyświetlane.
Wyświetlanie alertów podczas aktywnej nawigacji możesz skonfigurować za pomocą
shouldDisplayPrompts, który kontroluje też wyświetlanie
powiadomień 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 ten przycisk, pojawi się menu z dostępnymi typami utrudnień do zgłoszenia. Zgłoszenia przesyłane przez użytkowników są przetwarzane przez Google i mogą być wyświetlane na mapie dla innych użytkowników Map Google i Navigation SDK.
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 utrudnień możesz dodać do interfejsu nawigacji niestandardowy przycisk zgłaszania. Gdy użytkownik kliknie niestandardowy przycisk, 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 jest włączona funkcja zgłaszania, 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 pakietu SDK Navigation zawiera niestandardowe elementy interfejsu, musisz wziąć pod uwagę elementy zakłócenia działania w czasie rzeczywistym, aby uniknąć konfliktów.
Położenie przycisku zgłaszania
Domyślnie przycisk zgłaszania utrudnień znajduje się 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 parametrubottomTrailingButtonsLayoutGuide.
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 niestandardowymi elementami interfejsu, dodając odbiornik, który będzie otrzymywać wywołanie zwrotne przed pojawieniem się elementu interfejsu Navigation SDK i zaraz po jego usunięciu. Możesz otrzymywać wywołania zwrotne dotyczące elementów utrudnień w czasie rzeczywistym, w tym kart informacyjnych, alertów i menu zgłaszania utrudnień, 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. } ...