בחירת פלטפורמה: Android iOS

הגדרת שיבושים בזמן אמת

התכונה "שיבושים בזמן אמת" היא אוסף של תכונות שמתריעות למשתמשים על שיבושים לאורך המסלול שלהם, ומאפשרות להם לדווח על שיבושים שהם נתקלים בהם ולאמת אותם. דוגמאות לשיבושים: תאונות דרכים, עומסי תנועה, נוכחות של משטרה ומצלמות מהירות, עבודות בכביש, נתיבים חסומים ותנאי מזג אוויר מסוימים. בדף הזה מוסבר על התכונות של שיבושים בזמן אמת ועל אפשרויות ההגדרה שלהן, כולל שיקולים לגבי אפליקציות שמשתמשות בממשקי משתמש מותאמים אישית לניווט.

תכונות של שיבושים בזמן אמת

‫Navigation SDK כולל את התכונות הבאות לזיהוי שיבושים בזמן אמת, כחלק מחוויית הניווט הבסיסית:

התכונות האלה ניתנות להגדרה ומופעלות כברירת מחדל. בקטעים הבאים מפורט מידע נוסף על התכונות ועל אפשרויות ההגדרה הזמינות.

הסברים אינטראקטיביים על שיבושים לאורך המסלולים

כשאפליקציה מציגה מסלול, בסקירת מסלול או במהלך ניווט פעיל, כל השיבושים הנוכחיים מופיעים כהסברים לאורך המסלול. כשמפעילים את שכבת התנועה, גם שיבושים מחוץ למסלול מופיעים במפה. ההסברים כוללים סמל שמציין את סוג השיבוש.

הסברים לאורך המסלול

אתם יכולים לשלוט בהצגת ההסברים על שיבושים לאורך מסלולים באמצעות shouldDisplayPrompts, שגם שולט בהצגת התראות אוטומטיות כשמשתמש מתקרב לשיבוש.

mapView.navigator.shouldDisplayPrompts = true

הצגת פרטי השיבוש כשמשתמש לוחץ על תקציר

לחיצה על סימון של שיבוש פותחת כרטיס מידע עם פרטים נוספים. ההודעות האלה מופיעות גם במסלול וגם מחוץ למסלול, אבל ההודעות מחוץ למסלול מופיעות רק אם שכבת התנועה מופעלת. בכרטיס מוצגים סוג השיבוש, השעה שבה הוא דווח לאחרונה, ולפעמים גם אפשרות להצביע אם השיבוש עדיין קיים. סוג כרטיס המידע ואפשרויות ההגדרה שלו משתנים בהתאם למצב הניווט של המשתמש.

כרטיסי מידע עם הסברים בסקירות הכלליות של המסלולים, לפני שמתחילים לנווט באופן פעיל

לפני שמתחילים לנווט, אפשר ללחוץ על הסבר קצר במסלול או מחוץ למסלול במפה או בסקירת המסלול כדי לפתוח כרטיס מידע. כדי להציג הודעות על חריגה מהמסלול, צריך להפעיל את שכבת התנועה. בכרטיס המידע מופיעים פרטים נוספים על השיבוש.

כרטיס מידע של סקירה כללית

אתם יכולים להשתמש ב-showsIncidentCards כדי לקבוע אם המשתמשים יוכלו ללחוץ על הסמלים של השיבושים בסקירות המסלולים כדי להציג מידע נוסף.

mapView.settings.showsIncidentCards = true

כרטיסי מידע עם הסברים במהלך ניווט פעיל

בזמן ניווט פעיל, המשתמשים יכולים ללחוץ על הסבר קצר על שיבוש במסלול או מחוץ למסלול כדי לפתוח כרטיס מידע. בכרטיס מוצגים סוג השיבוש והשעה האחרונה שבה הוא דווח, והוא כולל כפתורים שמאפשרים למשתמשים להצביע אם השיבוש עדיין קיים.

ההצבעה זמינה לשיבושים במסלול ומחוץ למסלול בטווח של 5 ק"מ מהמשתמש, למעט סגירות כבישים. ‫Google מעבדת את ההצבעות האלה כדי לקבוע אם להמשיך להציג את השיבוש. ההצבעות עשויות להופיע במפה גם למשתמשים אחרים במפות Google וב-Navigation SDK.

כרטיס מידע על ניווט פעיל

אתם יכולים לשלוט בתצוגה ובאפשרות ללחוץ על הודעות על שיבושים במהלך ניווט פעיל באמצעות shouldDisplayPrompts, שגם שולט בהצגת ההודעות לאורך המסלולים ובהצגת ההתראות האוטומטיות כשמשתמש מתקרב לשיבוש.

mapView.navigator.shouldDisplayPrompts = true

התראות אוטומטיות על שיבושים עם אפשרות להצביע בזמן ניווט פעיל

במהלך ניווט פעיל, כשמשתמש מתקרב לשיבוש לאורך המסלול, מופיעה הנחיה עם מידע על השיבוש ולחצנים להצבעה אם השיבוש עדיין קיים. ‫Google מעבדת את ההצבעות של המשתמשים, ויכול להיות שהן יוצגו במפה למשתמשים אחרים במפות Google וב-Navigation SDK. בנוסף, ההצבעות משמשות כדי לקבוע אם להמשיך להציג את השיבוש.

כרטיס מידע על ניווט פעיל

אפשר להגדיר את הצגת ההתראות במהלך ניווט פעיל באמצעות shouldDisplayPrompts, שגם שולט בהצגת ההתראות לאורך המסלולים.

mapView.navigator.shouldDisplayPrompts = true

דיווח על שיבושים במהלך ניווט פעיל

במצב ניווט פעיל, מופיע כפתור בממשק המשתמש של הניווט שמאפשר למשתמשים לדווח על שיבושים חדשים לאורך המסלול שלהם. כשמשתמש לוחץ על הכפתור, מופיע תפריט עם סוגי השיבושים הזמינים לדיווח. הדיווחים שמשתמשים שולחים מעובדים על ידי Google, ויכול להיות שהם יוצגו במפה למשתמשים אחרים של מפות Google ושל Navigation SDK.

כפתור הדיווח תפריט דיווחים

הצגה או הסתרה של כפתור הדיווח הרגיל

אפשר להגדיר את החשיפה של כפתור הדיווח הרגיל במהלך ניווט פעיל באמצעות navigationReportIncidentButtonEnabled.

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

הוספת כפתור דיווח בהתאמה אישית

במקום כפתור הדיווח הרגיל על שיבושים, אתם יכולים להוסיף כפתור דיווח בהתאמה אישית לממשק המשתמש של הניווט. כשהמשתמש לוחץ על הכפתור בהתאמה אישית, אפשר להפעיל את הצגת תפריט הדיווח על ידי קריאה ל-method‏ presentReportIncidentsPanel. לפני שמוסיפים כפתור דיווח בהתאמה אישית, צריך לוודא שהאפליקציה נמצאת במצב ניווט פעיל ושהמשתמש נמצא במדינה שבה הדיווח מופעל. כדי לעשות את זה, צריך להפעיל את reportIncidentsAvailable. אם אחד מהתנאים האלה לא מתקיים, תפריט הדיווח לא יופיע.

  // 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.
          }
     }

עבודה עם ממשקי משתמש מותאמים אישית לניווט

אם ההטמעה של Navigation SDK כוללת רכיבים מותאמים אישית בממשק המשתמש, צריך להביא בחשבון את רכיבי ההפרעה בזמן אמת כדי למנוע התנגשויות.

מיקום כפתור הדיווח

כברירת מחדל, הכפתור לדיווח על שיבושים ממוקם בפינה התחתונה של המפה – בצד ימין בשפות שנכתבות משמאל לימין, ובצד שמאל בשפות שנכתבות מימין לשמאל. אם אתם צריכים להזיז את כפתור הדיווח כדי לפנות מקום לרכיבים מותאמים אישית בממשק המשתמש, השתמשו ב-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 (ניסיוני)

‫Prompt Visibility API עוזר לכם למנוע התנגשויות בין רכיבים בממשק המשתמש שנוצרו על ידי Navigation SDK לבין רכיבים בממשק המשתמש שאתם התאמתם אישית. כדי לעשות את זה, אתם יכולים להוסיף מאזין שיקבל קריאה חוזרת (callback) לפני שרכיב בממשק המשתמש של Navigation SDK עומד להופיע וברגע שהרכיב מוסר. אתם יכולים לקבל קריאות חוזרות (callbacks) על רכיבים של שיבושים בזמן אמת, כולל כרטיסי מידע, הנחיות ותפריט הדיווח על שיבושים, וגם על התראות אחרות שנוצרות על ידי 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.
}
...