监听导航事件

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

概览

Navigation SDK for iOS 为您提供了与用户位置和沿途条件以及重要的时间和距离数据相关联的监听器。在地图的视图控制器上,您的应用需要为这些监听器采用以下协议: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 实例公开了以下属性:

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

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

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

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatedLocation];

以下代码会创建一个用于处理 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 navgator(_ navigator: GMSNavigator, doneArriveAt Waypoint: GMSNavigationWaypoint) { print("您抵达了:(搜点.标题")) mapView.navigator?.continueToNextDestination() mapView.navigator?.isGuidanceActive = true }

Objective-C

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

接收路由更改更新

如需在路线发生更改时收到通知,请创建用于处理 navigatorDidChangeRoute 事件的方法。您可以使用 GMSNavigatorrouteLegscurrentRouteLeg 属性访问新路由。

Swift

func navigatorDidChangeRoute(_ navigator: GMSNavigator) { print("路线已更改。")}

Objective-C

  • (void)navigatorDidChangeRoute:(GMSNavigator *)navigator { NSLog(@"The route has changed."); }

接收到达目标位置所需的时间

如需连续接收目的地更新,请创建用于处理 didUpdateRemainingTime 事件的方法。time 参数提供到达下一个目的地的预计时间(以秒为单位)。

Swift

func navgator(_ navigator: GMSNavigator, doUpdateRemainingTime 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 navgator(_ navigator: GMSNavigator, doUpdateRemainingDistanceDistance: CLLocationDistance) { let 过滤器 = 距离 * 0.00062137 print("与下一个目的地的距离:(miles)mile.")}

Objective-C

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

如需设置与下一个目的地的估算距离的最小变化,请设置 GMSNavigatordistanceUpdateThreshold 属性(值以米为单位指定)。如果未设置该属性,则服务将使用默认值一米。

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

接收流量更新

如需持续接收剩余路线的流量更新,请创建用于处理 didUpdateDelayCategory 事件的方法。调用 delayCategoryToNextDestination 会返回 GMSNavigationDelayCategory,它会提供 0 到 3 之间的值。类别的更新基于应用用户的当前位置。如果没有路况数据,GMSNavigationDelayCategory 会返回 0。数字 1-3 表示流量从低到大逐渐增加。

Swift

func navgator(_ navigator: GMSNavigator, doUpdate 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

// 用于处理加速事件的监听器。fun navigator( _ navigator: GMSNavigator, doUpdateSpeedingPercentage percentageAboveLimit: CGFloat ) { print("Speed is (percentageAboveLimit) above the limit.")}

Objective-C

// 用于处理加速事件的监听器。- (void)navigator:(GMSNavigator *)navgator DidUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit { NSLog(@"Speed is %f percentage over the limit.", percentageAboveLimit); }

更改建议的光照模式

如需接收光效预计变化的更新,请创建用于处理 didChangeSuggestedLightingMode 事件的方法。

Swift

// 定义一个监听器,以监听对光照模式的建议更改。foc navgator(_ navigator: GMSNavigator, DidChangeSuggestedLightingMode lightingMode: GMSNavigationLightingMode) { print("Suggested lighting mode has changed: (String(de 以查看: lightingMode)"))

// 进行建议的更改。mapView.lightingMode = lightingMode }

Objective-C

// 定义一个监听器,以监听对光照模式的建议更改。 -(void)navigator:(GMSNavigator *)navgator doneChangeSuggestedLightingMode: (GMSNavigationLightingMode)lightingMode { NSLog(@"Suggested lighting mode has change: %ld", (long)lightingMode);

// 执行建议的更改。_mapView.lightingMode = lightingMode; }