ฟังเหตุการณ์การนําทาง

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

ภาพรวม

Navigation SDK สำหรับ iOS มี Listener ที่เชื่อมโยงกับตำแหน่งของผู้ใช้และสภาพตามเส้นทาง รวมถึงข้อมูลเวลาและระยะทางที่สำคัญ ในตัวควบคุมมุมมองของแผนที่ แอปของคุณต้องใช้โปรโตคอลสำหรับ Listener ต่อไปนี้ GMSRoadSnappedLocationProviderListener และ GMSNavigatorListener

รายการนี้แสดงเมธอด Listener ที่ใช้ได้สำหรับเหตุการณ์การนำทาง

  • GMSNavigatorListener.didArriveAtWaypoint ซึ่งจะทริกเกอร์เมื่อถึงปลายทาง
  • GMSNavigatorListener.navigatorDidChangeRoute จะทริกเกอร์เมื่อเส้นทางมีการเปลี่ยนแปลง
  • GMSNavigatorListener.didUpdateRemainingTime ซึ่งจะเรียกซ้ำๆ เมื่อเวลาที่ใช้เดินทางไปยังจุดหมายถัดไปเปลี่ยนแปลงขณะที่การนำทางทำงานอยู่
  • GMSNavigatorListener.didUpdateRemainingDistance ระบบจะเรียกใช้ซ้ำๆ เมื่อระยะทางไปยังจุดหมายถัดไปเปลี่ยนแปลงขณะที่การนำทางทำงานอยู่
  • GMSNavigatorListener.didUpdateDelayCategory จะเรียกใช้เมื่อหมวดหมู่ความล่าช้าไปยังจุดหมายถัดไปมีการเปลี่ยนแปลงขณะที่การนำทางทำงานอยู่
  • GMSNavigatorListener.didChangeSuggestedLightingMode จะทริกเกอร์เมื่อมีการอัปเดตสภาพแสงโดยประมาณ ตัวอย่างเช่น เมื่อถึงเวลากลางคืนในตำแหน่งปัจจุบันของผู้ใช้ แสงจะเปลี่ยนไป
  • GMSNavigatorListener.didUpdateSpeedingPercentage จะทริกเกอร์เมื่อคนขับขับรถเกินขีดจำกัดความเร็ว
  • GMSRoadSnappedLocationProviderListener.didUpdateLocation ซึ่งจะเรียกใช้ซ้ำๆ เมื่อตำแหน่งของผู้ใช้เปลี่ยนแปลง

ดูโค้ด

การประกาศความสอดคล้องกับโปรโตคอลที่จำเป็น

ก่อนที่จะใช้วิธีการนำทาง ตัวควบคุมมุมมองต้องใช้โปรโตคอลต่อไปนี้

Swift

class ViewController:
  UIViewController,
  GMSNavigatorListener,
  GMSRoadSnappedLocationProviderListener
{
}

Objective-C

@interface ViewController () <GMSNavigatorListener, GMSRoadSnappedLocationProviderListener>
@end

หลังจากใช้โปรโตคอลการนำทางแล้ว ให้ตั้งค่า Listener เป็น View Controller ตัวอย่างเช่น คุณสามารถเพิ่มโค้ดต่อไปนี้ลงในเมธอด viewDidLoad()

Swift

mapView.navigator?.add(self)
mapView.roadSnappedLocationProvider?.add(self)

Objective-C

[_mapView.navigator addListener:self];
[_mapView.roadSnappedLocationProvider addListener:self];

การรับหรือหยุดการอัปเดตตำแหน่ง

ต้องมีการอัปเดตตำแหน่งเพื่อแสดงความคืบหน้าของผู้ใช้บนแผนที่

อินสแตนซ์ location จะแสดงพร็อพเพอร์ตี้ต่อไปนี้

พร็อพเพอร์ตี้สถานที่ตั้ง คำอธิบาย
ระดับความสูง ระดับความสูงปัจจุบัน
coordinate.latitude พิกัดละติจูดปัจจุบันที่สแนปกับถนน
coordinate.longitude พิกัดลองจิจูดที่สแนปกับถนนในปัจจุบัน
หลักสูตร ทิศทางปัจจุบันเป็นองศา
ความเร็ว ความเร็วในปัจจุบัน
การประทับเวลา วันที่/เวลาของค่าที่อ่านได้ในปัจจุบัน

หากต้องการรับการอัปเดตตำแหน่งอย่างต่อเนื่อง ให้เรียกใช้ mapView.roadSnappedLocationProvider.startUpdatingLocation และใช้ GMSRoadSnappedLocationProviderListener เพื่อจัดการเหตุการณ์ didUpdateLocation

ตัวอย่างต่อไปนี้แสดงการเรียก startUpdatingLocation

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

โค้ดต่อไปนี้จะสร้าง GMSRoadSnappedLocationProviderListener ที่จัดการเหตุการณ์ didUpdateLocation

Swift

func locationProvider(_ locationProvider: GMSRoadSnappedLocationProvider,
                      didUpdate location: CLLocation) {
  print("Location: \(location.description)")
}

Objective-C

- (void)locationProvider:(GMSRoadSnappedLocationProvider *)locationProvider
       didUpdateLocation:(CLLocation *)location {
  NSLog(@"Location: %@", location.description);
}

หากต้องการรับการอัปเดตตำแหน่งเมื่อแอปทำงานอยู่เบื้องหลัง ให้ตั้งค่า allowsBackgroundLocationUpdates เป็น "จริง" ดังนี้

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

การตรวจจับเหตุการณ์การมาถึง

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

หลังจากที่แอปเรียกใช้ continueToNextDestinationWithCompletion แล้ว เครื่องมือนำทางจะไม่มีข้อมูลเกี่ยวกับจุดหมายก่อนหน้าอีกต่อไป หากต้องการวิเคราะห์ข้อมูลเกี่ยวกับช่วงเส้นทาง คุณต้องดึงข้อมูลนี้จากเครื่องมือนำทางก่อนเรียกใช้ continueToNextDestinationWithCompletion()

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีจัดการเหตุการณ์ didArriveAtWaypoint

Swift

func navigator(_ navigator: GMSNavigator, didArriveAt waypoint: GMSNavigationWaypoint) {
  print("You have arrived at: \(waypoint.title)")
  mapView.navigator?.continueToNextDestinationWithCompletion { _, _ in }
  mapView.navigator?.isGuidanceActive = true
}

Objective-C

- (void)navigator:(GMSNavigator *)navigator didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint {
  NSLog(@"You have arrived at: %@", waypoint.title);
  [_mapView.navigator continueToNextDestinationWithCompletion:^(GMSNavigationWaypoint *waypoint,
                                                                GMSRouteStatus status){
  }];
  _mapView.navigator.guidanceActive = YES;
}

การรับข้อมูลอัปเดตการเปลี่ยนแปลงเส้นทาง

หากต้องการรับการแจ้งเตือนเมื่อมีการเปลี่ยนแปลงเส้นทาง ให้สร้างเมธอดเพื่อจัดการเหตุการณ์ navigatorDidChangeRoute คุณเข้าถึงเส้นทางใหม่ได้โดยใช้พร็อพเพอร์ตี้ routeLegs และ currentRouteLeg ของ GMSNavigator

Swift

func navigatorDidChangeRoute(_ navigator: GMSNavigator) {
  print("The route has changed.")
}

Objective-C

- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator {
  NSLog(@"The route has changed.");
}

การรับข้อมูลอัปเดตเกี่ยวกับเวลาที่ใช้เดินทางไปยังจุดหมาย

หากต้องการรับข้อมูลอัปเดตเวลาถึงจุดหมายอย่างต่อเนื่อง ให้สร้างเมธอดเพื่อจัดการเหตุการณ์ didUpdateRemainingTime พารามิเตอร์ time จะระบุเวลาโดยประมาณเป็นวินาทีจนกว่าจะถึงจุดหมายถัดไป

Swift

func navigator(_ navigator: GMSNavigator, didUpdateRemainingTime time: TimeInterval) {
  print("Time to next destination: \(time)")
}

Objective-C

- (void)navigator:(GMSNavigator *)navigator didUpdateRemainingTime:(NSTimeInterval)time {
  NSLog(@"Time to next destination: %f", time);
}

หากต้องการตั้งค่าการเปลี่ยนแปลงขั้นต่ำในเวลาที่คาดว่าจะถึงจุดหมายถัดไป ให้ตั้งค่าพร็อพเพอร์ตี้ timeUpdateThreshold ใน GMSNavigator โดยค่าจะระบุเป็นวินาที หากไม่ได้ตั้งค่าพร็อพเพอร์ตี้นี้ บริการจะใช้ค่าเริ่มต้นเป็น 1 วินาที

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

การรับข้อมูลอัปเดตเกี่ยวกับระยะทางไปยังจุดหมาย

หากต้องการรับข้อมูลอัปเดตระยะทางไปยังจุดหมายอย่างต่อเนื่อง ให้สร้างเมธอดเพื่อจัดการเหตุการณ์ didUpdateRemainingDistance พารามิเตอร์ distance จะระบุระยะทางโดยประมาณเป็นเมตรไปยังจุดหมายถัดไป

Swift

func navigator(_ navigator: GMSNavigator, didUpdateRemainingDistance distance: CLLocationDistance)
{
  let miles = distance * 0.00062137
  print("Distance to next destination: \(miles) miles.")
}

Objective-C

- (void)navigator:(GMSNavigator *)navigator
    didUpdateRemainingDistance:(CLLocationDistance)distance {
  double miles = distance * 0.00062137;
  NSLog(@"%@", [NSString stringWithFormat:@"Distance to next destination: %.2f.", miles]);
}

หากต้องการตั้งค่าการเปลี่ยนแปลงขั้นต่ำในระยะทางโดยประมาณไปยังจุดหมายถัดไป ให้ตั้งค่าพร็อพเพอร์ตี้ distanceUpdateThreshold ใน GMSNavigator (ค่าจะระบุเป็นเมตร) หากไม่ได้ตั้งค่าพร็อพเพอร์ตี้นี้ บริการจะใช้ค่าเริ่มต้นเป็น 1 เมตร

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

การรับข้อมูลอัปเดตการจราจร

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

Swift

func navigator(_ navigator: GMSNavigator,
               didUpdate delayCategory: GMSNavigationDelayCategory)
{
  print("Traffic flow to next destination: \(delayCategory)")
}

Objective-C

- (void)navigator:(GMSNavigator *)navigator
    didUpdateDelayCategory:(GMSNavigationDelayCategory)delayCategory {
  NSLog(@"Traffic flow to next destination: %ld", (long)delayCategory);
}

พร็อพเพอร์ตี้ GMSNavigationDelayCategory จะแสดงระดับความล่าช้าต่อไปนี้

หมวดหมู่ความล่าช้า คำอธิบาย
GMSNavigationDelayCategoryNoData 0 - ไม่พร้อมใช้งาน ไม่มีข้อมูลสำหรับการเข้าชมหรือ :
เส้นทาง
GMSNavigationDelayCategoryHeavy 1 - สูงมาก
GMSNavigationDelayCategoryMedium 2 - ปานกลาง
GMSNavigationDelayCategoryLight 3 - สว่าง

กำลังรับข้อมูลอัปเดตเกี่ยวกับการขับรถเร็วเกินกำหนด

หากต้องการรับข้อมูลอัปเดตเมื่อคนขับขับรถเกินขีดจำกัดความเร็ว ให้สร้างเมธอดเพื่อจัดการเหตุการณ์ didUpdateSpeedingPercentage

Swift

// Listener to handle speeding events.
func navigator(_ navigator: GMSNavigator,
               didUpdateSpeedingPercentage percentageAboveLimit: CGFloat)
{
  print("Speed is \(percentageAboveLimit) above the limit.")
}

Objective-C

// Listener to handle speeding events.
- (void)navigator:(GMSNavigator *)navigator
    didUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit {
  NSLog(@"Speed is %f percent above the limit.", percentageAboveLimit);
}

กำลังเปลี่ยนโหมดแสงที่แนะนำ

GMSNavigator จะคำนวณโหมดแสงที่แนะนำตามช่วงเวลาของวันและตำแหน่งของอุปกรณ์ และเรียกใช้เมธอด Listener didChangeSuggestedLightingMode เฉพาะเมื่อโหมดที่แนะนำมีการเปลี่ยนแปลง (เช่น เมื่อพระอาทิตย์ขึ้นหรือพระอาทิตย์ตก) เพื่อให้แผนที่เริ่มต้นด้วยโหมดแสงที่เหมาะสมเมื่อผู้ใช้เปิดแอป ให้ตั้งค่า mapView.lightingMode เป็น suggestedLightingMode ของเครื่องนำทางระหว่างการเริ่มต้น และใช้ didChangeSuggestedLightingMode เพื่อจัดการการเปลี่ยนแปลงที่ตามมา

ตัวอย่างต่อไปนี้แสดงวิธีตั้งค่าโหมดแสงเริ่มต้นและฟังการเปลี่ยนแปลงโหมดแสงที่แนะนำ

Swift

// Set the initial lighting mode on launch or setup.
mapView.lightingMode = mapView.navigator?.suggestedLightingMode ?? .normal

// Define a listener for suggested changes to lighting mode.
func navigator(_ navigator: GMSNavigator,
               didChangeSuggestedLightingMode lightingMode: GMSNavigationLightingMode)
{
  print("Suggested lighting mode has changed: \(String(describing: lightingMode))")

  // Make the suggested change.
  mapView.lightingMode = lightingMode
}

Objective-C

// Set the initial lighting mode on launch or setup.
_mapView.lightingMode = _mapView.navigator.suggestedLightingMode;

// Define a listener for suggested changes to lighting mode.
- (void)navigator:(GMSNavigator *)navigator
    didChangeSuggestedLightingMode:(GMSNavigationLightingMode)lightingMode {
  NSLog(@"Suggested lighting mode has changed: %ld", (long)lightingMode);

  // Make the suggested change.
  _mapView.lightingMode = lightingMode;
}

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