監聽導覽事件

本指南可讓應用程式監聽及回應使用者沿路線移動時變更的各種事件。本指南並未說明如何定義路線,只會回應沿途的事件。

總覽

Navigation SDK for iOS 可在路線上提供與使用者位置和條件相關的事件監聽器,以及重要的時間和距離資料。在地圖的檢視控制器上,應用程式需要為下列事件監聽器採用通訊協定:GMSRoadSnappedLocationProviderListenerGMSNavigatorListener

這份清單顯示適用於導覽事件的事件監聽器方法:

查看程式碼

宣告符合必要通訊協定

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

Swift

class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>

@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 = YES;

偵測抵達事件

應用程式使用 didArriveAtWaypoint 事件偵測已到達目的地。您可以呼叫 continueToNextDestination() 來繼續導航並前往下一個路線控點,接著再重新啟用引導功能。應用程式必須在呼叫 continueToNextDestination()「之後」重新啟用指引。

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

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

Swift

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

Objective-C

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

接收路徑變更更新

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

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); }

如要將預估時間下限設為前往下一個目的地,請在 GMSNavigator 上設定 timeUpdateThreshold 屬性。這個值以秒指定。如未設定此屬性,服務會使用預設值 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]); }

如要將預估距離下限設為抵達下一個目的地,請在 GMSNavigator 上設定 distanceUpdateThreshold 屬性 (以公尺為單位指定值)。如果未設定這項屬性,服務會使用預設值 (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; }