ใช้คู่มือนี้เพื่อเปิดใช้แอปให้รับฟังและตอบสนองต่อเหตุการณ์ต่างๆ ที่เปลี่ยนแปลงไปขณะที่ผู้ใช้กำลังนำทางไปตามเส้นทาง คู่มือนี้ไม่ได้ครอบคลุมการกำหนดเส้นทาง แต่จะครอบคลุมเฉพาะการตอบสนองต่อเหตุการณ์ตามเส้นทางเท่านั้น
ภาพรวม
Navigation SDK สำหรับ iOS มี Listener ที่เชื่อมโยงกับตำแหน่งของผู้ใช้และเงื่อนไขตามเส้นทาง รวมถึงข้อมูลเวลาและระยะทางที่สำคัญ ใน View Controller ของแผนที่ แอปของคุณ
ต้องใช้โปรโตคอลสำหรับ Listener เหล่านี้:
GMSRoadSnappedLocationProviderListener
และ
GMSNavigatorListener
รายการต่อไปนี้แสดงเมธอด Listener ที่ใช้ได้สำหรับเหตุการณ์การนำทาง
GMSNavigatorListener.didArriveAtWaypointจะทริกเกอร์เมื่อถึงจุดหมายGMSNavigatorListener.navigatorDidChangeRouteจะทริกเกอร์เมื่อเส้นทางเปลี่ยนGMSNavigatorListener.didUpdateRemainingTimeจะเรียกใช้ซ้ำๆ เมื่อเวลาที่เหลือจนถึงจุดหมายถัดไปเปลี่ยนไป ขณะที่คำแนะนำการนำทางทำงานอยู่GMSNavigatorListener.didUpdateRemainingDistanceจะเรียกใช้ซ้ำๆ เมื่อระยะทางที่เหลือจนถึงจุดหมายถัดไปเปลี่ยนไป ขณะที่คำแนะนำการนำทางทำงานอยู่GMSNavigatorListener.didUpdateDelayCategoryจะเรียกใช้เมื่อหมวดหมู่การหน่วงเวลาจนถึงจุดหมายถัดไปเปลี่ยนไป ขณะที่คำแนะนำการนำทางทำงานอยู่GMSNavigatorListener.didChangeSuggestedLightingModeจะทริกเกอร์เมื่อมีการอัปเดตสภาพแสงโดยประมาณ เช่น เมื่อตกกลางคืนในตำแหน่งปัจจุบันของผู้ใช้ แสงจะเปลี่ยนไปGMSNavigatorListener.didUpdateSpeedingPercentageจะทริกเกอร์เมื่อผู้ขับขี่ขับรถเร็วเกินขีดจำกัดความเร็วGMSRoadSnappedLocationProviderListener.didUpdateLocationจะเรียกใช้ซ้ำๆ เมื่อตำแหน่งของผู้ใช้เปลี่ยนไป
ดูโค้ด
การประกาศการปฏิบัติตามโปรโตคอลที่จำเป็น
ก่อนที่จะใช้เมธอดการนำทาง View Controller ต้องใช้โปรโตคอลต่อไปนี้
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 จะแสดงพร็อพเพอร์ตี้ต่อไปนี้
| พร็อพเพอร์ตี้ตำแหน่ง | คำอธิบาย |
|---|---|
| altitude | ระดับความสูงปัจจุบัน |
| coordinate.latitude | พิกัดละติจูดปัจจุบันที่ปรับให้ตรงกับถนน |
| coordinate.longitude | พิกัดลองจิจูดปัจจุบันที่ปรับให้ตรงกับถนน |
| course | ทิศทางปัจจุบันเป็นองศา |
| speed | ความเร็วปัจจุบัน |
| timestamp | วันที่/เวลาของการอ่านค่าปัจจุบัน |
หากต้องการรับการอัปเดตตำแหน่งอย่างต่อเนื่อง ให้เรียกใช้ 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);
}
การเปลี่ยนโหมดแสงที่แนะนำ
หากต้องการรับข้อมูลอัปเดตการเปลี่ยนแปลงแสงโดยประมาณ ให้สร้างเมธอดเพื่อจัดการเหตุการณ์ didChangeSuggestedLightingMode
Swift
// 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
// 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;
}