監聽導覽事件

本指南可讓您的應用程式監聽並回應使用者沿著路線導覽時變更的多種事件。本指南不涵蓋定義路徑的定義,僅回應路線沿途的事件。

總覽

iOS 版 Navigation SDK 提供事件監聽器,讓您找到沿途的使用者和條件位置,以及重要時間和重要時間和距離資料。在地圖的檢視控制器上,您的應用程式需要採用這些事件監聽器的通訊協定:GMSRoadSnappedLocationProviderListenerGMSNavigatorListener

下列清單顯示導覽事件可用的事件監聽器方法:

查看程式碼

宣告符合必要通訊協定

在導入導覽方法之前,檢視控制器必須採用通訊協定:

Swift

類別 ViewController:UIViewController、GMSNavigatorListener、GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <gmsnavigatorlistener, gmsroadsnappedlocationproviderlistener=""></gmsnavigatorlistener,>

@end 鍵

採用導覽通訊協定後,請將事件監聽器設為檢視控制器。舉例來說,您可以將下列程式碼加入 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 設為 true:

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = 是;

偵測抵達事件

應用程式會使用 didArriveAtWaypoint 事件偵測到達目的地的時間。只要呼叫 continueToNextDestination(),然後重新啟用指引,即可繼續導航並前進至下一個路線控點。應用程式必須在呼叫 continueToNextDestination()「之後」,重新啟用指引。

應用程式呼叫 continueToNextDestination 後,導覽器不會再有上一個目的地的相關資料。如要分析路線路段的相關資訊,請先從導覽器擷取這項資訊,再呼叫 continueToNextDestination()

以下程式碼範例顯示處理 didArriveAtWaypoint 事件的方法:

Swift

Fundc navigator(_ navigator: GMSNavigator, doArriveAt waypoint: GMSNavigationWaypoint) { print("您已抵達: (waypoint.title)") mapView.navigator?.continueToNextDestination() mapView.navigator?.isGuidanceActive = true }

Objective-C

  • (void)navigator:(GMSNavigator *)navigator didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint { NSLog(@"您已抵達: %@", waypoint.title); [_mapView.navigator continueToNextDestination]; _mapView.navigator.guidanceActive = YES; YES

接收路徑變更更新

如要在路徑變更時收到通知,請建立處理 navigatorDidChangeRoute 事件的方法。您可以使用 GMSNavigatorrouteLegscurrentRouteLeg 屬性來存取新路徑。

Swift

Fundc navigatorGoodChangeRoute(_ navigator: GMSNavigator) { print("路線已變更。")}

Objective-C

  • (void)navigator 威 ChangeRoute:(GMSNavigator *)navigator { NSLog(@"路線已變更。");}

接收目的地更新的時間

如要接收目的地更新的持續時間,請建立處理 didUpdateRemainingTime 事件的方法。time 參數提供到達下一個目的地的預計時間 (以秒為單位)。

Swift

Func navigator(_ navigator: GMSNavigator, wasUpdateRemainingTime time: TimeInterval) { print("Time to next destination: (time)") }

Objective-C

  • (void)navigator:(GMSNavigator *)navgator didUpdateRemainingTime:(NSTimeInterval)time { NSLog(@"前往下一個目的地的時間:%f", time); }

如要將預估時間的下限設為下一個目的地,請在 GMSNavigator 上設定 timeUpdateThreshold 屬性。指定這個值以秒為單位。如未設定此屬性,服務會使用預設值一秒。

Swift

navgator?.timeUpdateThreshold = 10

Objective-C

navgator.timeUpdateThreshold = 10;

接收與目的地更新的距離

如要接收持續抵達目的地更新的距離,請建立處理 didUpdateRemainingDistance 事件的方法。distance 參數提供到下一個目的地的預估距離 (以公尺為單位)。

Swift

Fundc navgator(_ navigator: GMSNavigator, wasUpdateRemainingDistanceDistance: CLLocationDistance) { let miles = 距離 * 0.00062137 print("目的地為 (英里) 的距離: (英里) 英里.")}

Objective-C

  • (void)navigator:(GMSNavigator *)navigator didUpdateRemainingDistance:(CLLocationDistance)distance { double miles = distance * 0.00062137; NSLog(@"%@", [NSString stringWithFormat:@"下一個目的地:%.2f.", miles]); }

如要將預估距離設為下一個目的地的最小變化幅度,請在 GMSNavigator 上設定 distanceUpdateThreshold 屬性 (以公尺為單位)。如未設定此屬性,服務會使用預設值 (一公尺)。

Swift

navgator?.distanceUpdateThreshold = 100

Objective-C

navgator.distanceUpdateThreshold = 100;

接收最新路況更新

如要持續更新剩餘路徑的流量流,請建立處理 didUpdateDelayCategory 事件的方法。呼叫 delayCategoryToNextDestination 會傳回 GMSNavigationDelayCategory,可提供 0 至 3 的值。系統會根據應用程式使用者的目前位置來更新類別。如果沒有可用的車流量資料,GMSNavigationDelayCategory 會傳回 0。數字 (1 至 3) 代表從輕到重的流動量。

Swift

Fundc navgator(_ navigator: GMSNavigator, wasUpdateDelayCategory: 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 - 無法使用,沒有流量資料或:
the route.
GMSNavigationDelayCategoryHeavy 1 - 重。
GMSNavigationDelayCategoryMedium 2 - 中。
GMSNavigationDelayCategoryLight 3 - 淺色。

接收速度更新

如要在驅動程式超過速限時接收更新,請建立處理 didUpdateSpeedingPercentage 事件的方法。

Swift

// 用來處理執行速度事件的接聽程式。Func navigator( _ navigator: GMSNavigator, doUpdateSpeedingPercentagePercentageAboveLimit: CGFloat ) { print("Speed is (percentageAboveLimit).")}

Objective-C

// 處理執行速度事件的接聽程式。- (void)navigator:(GMSNavigator *)navigator wasUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit { NSLog(@"速度是超過限制的 %f%。", PercentageAboveLimit); }

變更建議的亮度模式

如要接收光源變化的預估更新,請建立處理 didChangeSuggestedLightingMode 事件的方法。

Swift

為你

// 依照建議進行修改。mapView.lightingMode = lightMode }

Objective-C

// 定義建議變更亮度模式的事件監聽器。 -(void)navigator:(GMSNavigator *)navgator wasChangeSuggestedLightingMode: (GMSNavigationLightingMode)lightingMode { NSLog(@"Suggested light mode has changed: %ld", (long)lightingMode);

// 對建議進行變更。_mapView.lightingMode = lightMode; }