监听导航事件

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

概览

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

Location 属性 说明
altitude 当前海拔高度。
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; }