เลือกแพลตฟอร์ม: 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.
}
...