监听导航事件

借助本指南,您的应用可以监听和响应随着用户沿路线导航而发生变化的各种事件。本指南不介绍如何定义路线,仅响应路线沿途的事件。

概览

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 实例公开了以下属性:

Location 属性 说明
altitude 当前海拔高度。
coordinate.latitude 当前道路贴靠的纬度坐标。
coordinate.longitude 当前道路贴靠的经度坐标。
课程 当前方位(以度为单位)。
速度 当前速度。
时间戳 当前读数的日期/时间。

如需接收持续的位置信息更新,请调用 mapView.roadSnappedLocationProvider.startUpdatingLocation,并使用 GMSRoadSnappedLocationProviderListener 处理 didUpdateLocation 事件。

以下示例展示了如何调用 startUpdatingLocation

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

以下代码会创建用于处理 didUpdateLocation 事件的 GMSRoadSnappedLocationProviderListener

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 属性(值以米为单位指定)。如果未设置此属性,服务将使用一个电表的默认值。

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