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

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

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

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

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

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

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

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

יתרונות מרכזיים לאורך מסלולים

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

mapView.navigator.shouldDisplayPrompts = true

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

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

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

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

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

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

mapView.settings.showsIncidentCards = true

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

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

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

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

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

mapView.navigator.shouldDisplayPrompts = true

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

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

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

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

mapView.navigator.shouldDisplayPrompts = true

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

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

לחצן הדיווח תפריט הדיווחים

הצגה או הסתרה של לחצן הדוחות הרגילים

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

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

הוספה של לחצן דיווח בהתאמה אישית

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

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