Configurare le interruzioni in tempo reale
Le interruzioni in tempo reale sono un insieme di funzionalità che avvisano gli utenti delle interruzioni lungo il loro percorso e consentono loro di segnalare e verificare le interruzioni che incontrano. Esempi di interruzioni includono incidenti stradali, traffico intenso, presenza di polizia e autovelox fisso, lavori in corso, chiusure di corsie e determinate condizioni meteorologiche. Questa pagina illustra le funzionalità di interruzione in tempo reale e le relative opzioni di configurazione, incluse le considerazioni per le app che utilizzano UI di navigazione personalizzate.
Funzionalità di interruzione in tempo reale
Navigation SDK include le seguenti funzionalità di interruzione in tempo reale come parte dell'esperienza di navigazione di base:- Callout interattivi per le interruzioni lungo i percorsi.
- Avvisi di interruzione automatici con votazione durante la navigazione attiva.
- Segnalazione di interruzioni durante la navigazione attiva.
Queste funzionalità sono configurabili e attivate per impostazione predefinita. Le sezioni seguenti forniscono ulteriori informazioni sulle funzionalità e sulle opzioni di configurazione disponibili.
Callout interattivi per le interruzioni lungo i percorsi
Quando un'app mostra un percorso, in una panoramica del percorso o durante la navigazione attiva, le interruzioni correnti vengono visualizzate come callout lungo il percorso. Quando attivi il livello del traffico, le interruzioni fuori percorso vengono visualizzate anche sulla mappa. I callout includono un'icona che indica il tipo di interruzione.
Puoi controllare la visualizzazione dei callout di interruzione lungo i percorsi utilizzando shouldDisplayPrompts, che controlla anche la visualizzazione degli avvisi automatici quando un utente si avvicina a un'interruzione.
mapView.navigator.shouldDisplayPrompts = true
Visualizzare i dettagli dell'interruzione quando un utente tocca un callout
Se tocchi un callout di interruzione, si apre una scheda informativa con maggiori dettagli. Questo vale sia per i callout sul percorso sia per quelli fuori percorso, anche se questi ultimi vengono visualizzati solo se il livello del traffico è attivo. La scheda mostra il tipo di interruzione, l'ultima volta in cui è stata segnalata e, a volte, un'opzione per votare se l'interruzione è ancora presente. Il tipo di scheda informativa e le relative opzioni di configurazione variano a seconda che l'utente sia in navigazione attiva.
Schede informative dei callout nelle panoramiche dei percorsi, prima di avviare la navigazione attiva
Prima di avviare la navigazione attiva, gli utenti possono toccare un callout sul percorso o fuori percorso sulla mappa o nella panoramica del percorso per aprire una scheda informativa. I callout fuori percorso richiedono che il livello del traffico sia attivo. La scheda informativa fornisce maggiori dettagli sull'interruzione.
Puoi controllare la possibilità degli utenti di toccare i callout di interruzione nelle panoramiche dei percorsi per visualizzare ulteriori
informazioni utilizzando
showsIncidentCards.
mapView.settings.showsIncidentCards = true
Schede informative dei callout durante la navigazione attiva
Durante la navigazione attiva, gli utenti possono toccare un callout di interruzione sul percorso o fuori percorso per aprire una scheda informativa. La scheda mostra il tipo di interruzione e l'ultima volta in cui è stata segnalata e include pulsanti per consentire agli utenti di votare se l'interruzione è ancora presente.
La votazione è disponibile per le interruzioni sul percorso e fuori percorso entro 5 km dall'utente, escluse le chiusure stradali. Google elabora questi voti per determinare se continuare a mostrare l'interruzione. I voti potrebbero essere visualizzati sulla mappa anche per altri utenti di Google Maps e Navigation SDK.
Puoi controllare la visualizzazione e la possibilità di toccare i callout di interruzione durante la navigazione attiva utilizzando
shouldDisplayPrompts, che controlla anche la
visualizzazione dei callout lungo i percorsi e la
visualizzazione degli avvisi automatici quando un utente si avvicina a un'interruzione.
mapView.navigator.shouldDisplayPrompts = true
Avvisi di interruzione automatici con votazione durante la navigazione attiva
Durante la navigazione attiva, quando un utente si avvicina a un'interruzione lungo un percorso, viene visualizzato un prompt con informazioni sull'interruzione e pulsanti per votare se l'interruzione è ancora presente. I voti inviati dagli utenti vengono elaborati da Google e potrebbero essere visualizzati sulla mappa per altri utenti di Google Maps e Navigation SDK, nonché utilizzati per determinare se continuare a mostrare l'interruzione.
Puoi configurare la visualizzazione dei prompt di avviso durante la navigazione attiva utilizzando
shouldDisplayPrompts, che controlla anche la visualizzazione
dei callout lungo i percorsi.
mapView.navigator.shouldDisplayPrompts = true
Segnalazione di interruzioni durante la navigazione attiva
Durante la modalità di navigazione attiva, nell'UI di navigazione viene visualizzato un pulsante che consente agli utenti di segnalare nuove interruzioni lungo il loro percorso. Quando un utente tocca il pulsante, viene visualizzato un menu con i tipi di interruzione disponibili da segnalare. Le segnalazioni inviate dagli utenti vengono elaborate da Google e potrebbero essere visualizzate sulla mappa per altri utenti di Google Maps e Navigation SDK.
Mostrare o nascondere il pulsante di segnalazione standard
Puoi configurare la visibilità del pulsante di segnalazione standard durante la navigazione attiva utilizzando
navigationReportIncidentButtonEnabled.
// Enables the incident reporting FAB to show in situations where incident // reporting is possible. mapView.settings.navigationReportIncidentButtonEnabled = true
Aggiungere un pulsante di segnalazione personalizzato
Al posto del pulsante di segnalazione delle interruzioni standard, puoi aggiungere un pulsante di segnalazione personalizzato all'UI di navigazione. Quando l'utente fa clic sul pulsante personalizzato, puoi attivare la visualizzazione del menu di segnalazione chiamando il presentReportIncidentsPanel
metodo. Prima di aggiungere un pulsante di segnalazione personalizzato, verifica che l'app sia in navigazione attiva e che l'utente si trovi in un paese in cui la segnalazione è attiva chiamando reportIncidentsAvailable. Se una di queste condizioni non è vera, il menu di segnalazione non verrà visualizzato.
// 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. } }
Utilizzare UI di navigazione personalizzate
Se la tua implementazione di Navigation SDK include elementi UI personalizzati, devi prendere in considerazione gli elementi di interruzione in tempo reale per evitare conflitti.
Posizionamento del pulsante di segnalazione
Per impostazione predefinita, il pulsante di segnalazione delle interruzioni si trova nell'angolo inferiore finale/finale della mappa, sul lato destro per le lingue con scrittura da sinistra a destra e sul lato sinistro per le lingue con scrittura da destra a sinistra. Se devi spostare il pulsante di segnalazione per fare spazio agli elementi UI personalizzati, utilizza unabottomTrailingButtonsLayoutGuide.
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;
API Prompt Visibility (sperimentale)
L'API Prompt Visibility ti aiuta a evitare conflitti tra gli elementi UI generati da Navigation SDK e i tuoi elementi UI personalizzati aggiungendo un listener per ricevere un callback prima che un elemento UI di Navigation SDK stia per essere visualizzato e non appena l'elemento viene rimosso. Puoi ricevere callback per gli elementi di interruzione in tempo reale, incluse schede informative, prompt e il menu di segnalazione delle interruzioni, nonché per altre notifiche generate da 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. } ...