監聽導覽事件

這份指南可協助應用程式監聽及回應各種事件 這類變更會隨著使用者沿著路線瀏覽而變更本指南不在涵蓋範圍內 定義路線,只回應路線上的事件。

總覽

iOS 版 Navigation SDK 提供事件監聽器 與使用者所在位置及路線上的 聯絡方式,以及 重要的時間和距離資料在地圖的檢視控制器上,您的應用程式 必須採用這些事件監聽器的通訊協定: 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,並使用 處理 didUpdateLocationGMSRoadSnappedLocationProviderListener 活動。

下例示範如何呼叫 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); }

如要將預估時間下限設為前往下一個目的地,請設定 GMSNavigatortimeUpdateThreshold資源。該值會在 秒內請求驗證碼。如果未設定此屬性,服務會使用預設值 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]); }

如要設定前往下一個目的地的預估距離最小值,請設定 GMSNavigatordistanceUpdateThreshold 屬性 (已在 公尺)。如果未設定此屬性,服務會使用預設值 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; }