เลือกแพลตฟอร์ม: Android iOS

กำหนดค่าเหตุขัดข้องแบบเรียลไทม์

เหตุขัดข้องแบบเรียลไทม์คือชุดฟีเจอร์ที่แจ้งเตือนผู้ใช้เกี่ยวกับเหตุขัดข้องตามเส้นทาง และอนุญาตให้ผู้ใช้รายงานและยืนยันเหตุขัดข้องที่พบ ตัวอย่างเหตุขัดข้อง ได้แก่ อุบัติเหตุจากยานพาหนะ การจราจรติดขัด การปรากฏตัวของตำรวจและกล้องจับความเร็ว การก่อสร้าง การปิดช่องทางจราจร และสภาพอากาศบางอย่าง หน้านี้จะอธิบายฟีเจอร์เหตุขัดข้องแบบเรียลไทม์และตัวเลือกการกำหนดค่า รวมถึงข้อควรพิจารณาสำหรับแอปที่ใช้ UI การนำทางที่กำหนดเอง

ฟีเจอร์เหตุขัดข้องแบบเรียลไทม์

Navigation SDK มีฟีเจอร์เหตุขัดข้องแบบเรียลไทม์ต่อไปนี้ซึ่งเป็นส่วนหนึ่งของประสบการณ์การนำทางหลัก

ฟีเจอร์เหล่านี้กำหนดค่าได้และเปิดใช้โดยค่าเริ่มต้น ส่วนต่อไปนี้จะให้ข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์และตัวเลือกการกำหนดค่าที่มี

คำอธิบายประกอบเหตุขัดข้องแบบอินเทอร์แอกทีฟตามเส้นทาง

เมื่อแอปแสดงเส้นทาง ไม่ว่าจะเป็นในภาพรวมเส้นทางหรือระหว่างการนำทางที่ใช้งานอยู่ เหตุขัดข้องปัจจุบันจะปรากฏเป็นคำอธิบายประกอบตามเส้นทาง เมื่อคุณเปิดใช้เลเยอร์การจราจร เหตุขัดข้องนอกเส้นทางก็จะปรากฏบนแผนที่ด้วย คำอธิบายประกอบจะมีไอคอนที่ระบุประเภทเหตุขัดข้อง

ข้อความไฮไลต์ตามเส้นทาง

คุณสามารถควบคุมการแสดงคำอธิบายประกอบเหตุขัดข้องตามเส้นทางได้โดยใช้ shouldDisplayPrompts ซึ่งจะควบคุมการแสดงการแจ้งเตือนอัตโนมัติเมื่อผู้ใช้เข้าใกล้เหตุขัดข้อง

mapView.navigator.shouldDisplayPrompts = true

แสดงรายละเอียดเหตุขัดข้องเมื่อผู้ใช้แตะคำอธิบายประกอบ

การแตะคำอธิบายประกอบเหตุขัดข้องจะเปิดการ์ดข้อมูลที่มีรายละเอียดเพิ่มเติม ซึ่งใช้ได้กับคำอธิบายประกอบทั้งในและนอกเส้นทาง แม้ว่าคำอธิบายประกอบนอกเส้นทางจะปรากฏขึ้นก็ต่อเมื่อเปิดใช้เลเยอร์การจราจร การ์ดจะแสดงประเภทเหตุขัดข้อง เวลาที่รายงานล่าสุด และบางครั้งจะมีตัวเลือกให้โหวตว่าเหตุขัดข้องยังคงอยู่หรือไม่ ประเภทการ์ดข้อมูลและตัวเลือกการกำหนดค่าจะแตกต่างกันไปตามสถานะการนำทางที่ใช้งานอยู่ของผู้ใช้

การ์ดข้อมูลคำอธิบายประกอบในภาพรวมเส้นทางก่อนเริ่มการนำทางที่ใช้งานอยู่

ก่อนเริ่มการนำทางที่ใช้งานอยู่ ผู้ใช้สามารถแตะคำอธิบายประกอบในหรือนอกเส้นทางบนแผนที่หรือภาพรวมเส้นทางเพื่อเปิดการ์ดข้อมูล คำอธิบายประกอบนอกเส้นทางต้องเปิดใช้เลเยอร์การจราจร การ์ดข้อมูลจะแสดงรายละเอียดเพิ่มเติมเกี่ยวกับเหตุขัดข้อง

การ์ดข้อมูลภาพรวม

คุณสามารถควบคุมความสามารถของผู้ใช้ในการแตะคำอธิบายประกอบเหตุขัดข้องในภาพรวมเส้นทางเพื่อแสดงข้อมูลเพิ่มเติมได้โดยใช้ showsIncidentCards

mapView.settings.showsIncidentCards = true

การ์ดข้อมูลคำอธิบายประกอบระหว่างการนำทางที่ใช้งานอยู่

ระหว่างการนำทางที่ใช้งานอยู่ ผู้ใช้สามารถแตะคำอธิบายประกอบเหตุขัดข้องในหรือนอกเส้นทางเพื่อเปิดการ์ดข้อมูล การ์ดจะแสดงประเภทเหตุขัดข้องและเวลาที่รายงานล่าสุด รวมถึงปุ่มให้ผู้ใช้โหวตว่าเหตุขัดข้องยังคงอยู่หรือไม่

การโหวตใช้ได้กับเหตุขัดข้องในและนอกเส้นทางภายในระยะ 5 กม. จากผู้ใช้ ยกเว้นการปิดถนน Google จะประมวลผลการโหวตเหล่านี้เพื่อช่วยพิจารณาว่าจะแสดงเหตุขัดข้องต่อไปหรือไม่ การโหวตอาจปรากฏบนแผนที่สำหรับผู้ใช้ Google Maps และ Navigation SDK คนอื่นๆ ด้วย

การ์ดข้อมูลการนำทางที่ใช้งานอยู่

คุณสามารถควบคุมการแสดงและการแตะคำอธิบายประกอบเหตุขัดข้องระหว่างการนำทางที่ใช้งานอยู่ได้โดยใช้ shouldDisplayPrompts ซึ่งจะควบคุม การแสดงคำอธิบายประกอบตามเส้นทาง และ การแสดงการแจ้งเตือนอัตโนมัติเมื่อผู้ใช้เข้าใกล้เหตุขัดข้อง

mapView.navigator.shouldDisplayPrompts = true

การแจ้งเตือนเหตุขัดข้องอัตโนมัติพร้อมการโหวตระหว่างการนำทางที่ใช้งานอยู่

ระหว่างการนำทางที่ใช้งานอยู่ เมื่อผู้ใช้เข้าใกล้เหตุขัดข้องตามเส้นทาง ระบบจะแสดงข้อความแจ้งพร้อม ข้อมูลเกี่ยวกับเหตุขัดข้องและปุ่มให้โหวตว่าเหตุขัดข้องยังคงอยู่หรือไม่ Google จะประมวลผลการโหวตที่ผู้ใช้ส่งเข้ามาและอาจแสดงบนแผนที่สำหรับ ผู้ใช้ Google Maps และ Navigation SDK คนอื่นๆ รวมถึงใช้เพื่อพิจารณาว่าจะแสดงเหตุขัดข้องต่อไปหรือไม่

การ์ดข้อมูลการนำทางที่ใช้งานอยู่

คุณสามารถกำหนดค่าการแสดงข้อความแจ้งการแจ้งเตือนระหว่างการนำทางที่ใช้งานอยู่ได้โดยใช้ shouldDisplayPrompts ซึ่งจะควบคุมการแสดง ของ คำอธิบายประกอบตามเส้นทาง

mapView.navigator.shouldDisplayPrompts = true

การรายงานเหตุขัดข้องระหว่างการนำทางที่ใช้งานอยู่

ในโหมดการไปยังส่วนต่างๆ ที่ใช้งานอยู่ ปุ่มจะปรากฏใน UI การนำทางเพื่อให้ผู้ใช้รายงานเหตุขัดข้องใหม่ตามเส้นทางได้ เมื่อผู้ใช้แตะปุ่ม เมนูที่มีประเภทเหตุขัดข้องที่รายงานได้จะปรากฏขึ้น Google จะประมวลผลรายงานที่ผู้ใช้ส่งเข้ามาและอาจแสดงบนแผนที่สำหรับผู้ใช้ Google Maps และ Navigation SDK คนอื่นๆ

ปุ่มรายงาน เมนูการรายงาน

แสดงหรือซ่อนปุ่มรายงานมาตรฐาน

คุณสามารถกำหนดค่าการแสดงปุ่มรายงานมาตรฐานระหว่างการนำทางที่ใช้งานอยู่ได้โดยใช้ navigationReportIncidentButtonEnabled.

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

เพิ่มปุ่มรายงานที่กำหนดเอง

คุณสามารถเพิ่มปุ่มรายงานที่กำหนดเองลงใน UI การนำทางแทนปุ่มรายงานเหตุขัดข้องมาตรฐานได้ เมื่อผู้ใช้คลิกปุ่มที่กำหนดเอง คุณสามารถทริกเกอร์การแสดงเมนูรายงานได้โดยเรียกใช้เมธอด 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.
          }
     }

ทำงานร่วมกับ UI การนำทางที่กำหนดเอง

หากการติดตั้งใช้งาน Navigation SDK ของคุณมีองค์ประกอบ UI ที่กำหนดเอง คุณต้องพิจารณาองค์ประกอบเหตุขัดข้องแบบเรียลไทม์เพื่อหลีกเลี่ยงความขัดแย้ง

การวางตำแหน่งปุ่มรายงาน

โดยค่าเริ่มต้น ปุ่มรายงานเหตุขัดข้องจะอยู่ที่มุมล่างสุด/ท้ายของแผนที่ ซึ่งอยู่ทางด้านขวาสำหรับภาษาที่อ่านจากซ้ายไปขวา และด้านซ้ายสำหรับภาษาที่อ่านจากขวาไปซ้าย หากต้องการย้ายปุ่มรายงานเพื่อเพิ่มพื้นที่สำหรับองค์ประกอบ UI ที่กำหนดเอง ให้ใช้ 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 ช่วยให้คุณหลีกเลี่ยงความขัดแย้งระหว่างองค์ประกอบ UI ที่สร้างโดย Navigation SDK กับองค์ประกอบ UI ที่กำหนดเองของคุณเองได้โดยการเพิ่ม Listener เพื่อรับ Callback ก่อนที่องค์ประกอบ UI ของ 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.
}
...