示例中心
功能在线体验
menu 导航 closed 关闭
您现在的位置: 开发 > iOS 导航SDK > 开发指南 > 导航组件 > 基础功能 >

高德 开发 iOS 导航SDK 开发指南 导航组件 基础功能

更新时间:2020年10月21日

启动导航组件

初始化 AMapNaviCompositeManager 进行如下操作即可启动导航组件。 

// 初始化
self.compositeManager = [[AMapNaviCompositeManager alloc] init];
// 如果需要使用AMapNaviCompositeManagerDelegate的相关回调(如自定义语音、获取实时位置等),需要设置delegate  
self.compositeManager.delegate = self;  
// 通过present的方式显示路线规划页面, 在不传入起终点启动导航组件的模式下,options传入nil即可
[self.compositeManager presentRoutePlanViewControllerWithOptions:nil]; 
// 初始化
self.compositeManager = AMapNaviCompositeManager.init()
// 如果需要使用AMapNaviCompositeManagerDelegate的相关回调(如自定义语音、获取实时位置等),需要设置delegate 
self.compositeManager.delegate = self
// 通过present的方式显示路线规划页面, 在不传入起终点启动导航组件的模式下,options传入nil即可
self.compositeManager.presentRoutePlanViewController(withOptions: nil)

传入起终点启动导航组件

通过设置起点、途径点(最多支持三个)、终点启动导航组件;每个点数据可以通过经纬度、名称、高德 POIId 来描述,其参数规则如下:

  1. 经纬度数据为必填参数;
  2. 名称是可选参数仅用于显示地点名称,如果设置了名称参数,会优先显示所设置的名称,如果不传名称将使用默认值,如“终点”、“途径点1”;
  3. 高德 POIId 是可选参数,但强烈建议传入,因为其可以有效的减少绕路情况的出现。设置高德 POIId 来启动导航组件时,将会执行 POI 的精确检索,获得 POI 详情后不仅会辅助算路,也会覆盖传入的经纬度和名称两个参数。
  4. 当不设置起点信息时,会采用用户当前位置作为起点,并显示地点名称为“我的位置”。

传入终点坐标和名称,不传高德 POIId 示例: 

//导航组件配置类 since 5.2.0
AMapNaviCompositeUserConfig *config = [[AMapNaviCompositeUserConfig alloc] init];
//传入终点坐标
[config setRoutePlanPOIType:AMapNaviRoutePlanPOITypeEnd location:[AMapNaviPoint locationWithLatitude:39.918058 longitude:116.397026] name:@"故宫" POIId:nil];  
//启动
[self.compositeManager presentRoutePlanViewControllerWithOptions:config];
//导航组件配置类 since 5.2.0
let config = AMapNaviCompositeUserConfig.init()
//传入终点坐标
config.setRoutePlanPOIType(AMapNaviRoutePlanPOIType.end, location: AMapNaviPoint.location(withLatitude: 39.918058, longitude: 116.397026), name: "故宫", poiId: nil)
//启动
self.compositeManager.presentRoutePlanViewController(withOptions: config)

传入起终点、途经点坐标和名称,且传入高德 POIId 示例:

//导航组件配置类 since 5.2.0
AMapNaviCompositeUserConfig *config = [[AMapNaviCompositeUserConfig alloc] init];
//传入起点,并且带高德POIId
[config setRoutePlanPOIType:AMapNaviRoutePlanPOITypeStart location:[AMapNaviPoint locationWithLatitude:40.080525 longitude:116.603039] name:@"北京首都机场" POIId:@"B000A28DAE"];     
//传入途径点,并且带高德POIId
[config setRoutePlanPOIType:AMapNaviRoutePlanPOITypeWay location:[AMapNaviPoint locationWithLatitude:39.941823 longitude:116.426319] name:@"北京大学" POIId:@"B000A816R6"];            
//传入终点,并且带高德POIId
[config setRoutePlanPOIType:AMapNaviRoutePlanPOITypeEnd location:[AMapNaviPoint locationWithLatitude:39.918058 longitude:116.397026] name:@"故宫" POIId:@"B000A8UIN8"];          
//启动
[self.compositeManager presentRoutePlanViewControllerWithOptions:config];
//导航组件配置类 since 5.2.0
let config = AMapNaviCompositeUserConfig.init()
//传入起点,并且带高德POIId
config.setRoutePlanPOIType(AMapNaviRoutePlanPOIType.start, location: AMapNaviPoint.location(withLatitude: 40.080525, longitude: 116.603039), name: "北京首都机场", poiId: "B000A28DAE") 
//传入途径点,并且带高德POIId
config.setRoutePlanPOIType(AMapNaviRoutePlanPOIType.way, location: AMapNaviPoint.location(withLatitude: 39.941823, longitude: 116.426319), name: "北京大学", poiId: "B000A816R6")      
//传入终点,并且带高德POIId
config.setRoutePlanPOIType(AMapNaviRoutePlanPOIType.end, location: AMapNaviPoint.location(withLatitude: 39.918058, longitude: 116.397026), name: "故宫", poiId: "B000A8UIN8")
//启动
self.compositeManager.presentRoutePlanViewController(withOptions: config)

使用货车导航组件

从导航SDK v6.0.0版本开始,全面支持货车算路和导航功能,导航组件也支持货车类型了。其中主要区别于驾车的部分就是在货车的路径规划策略中,会将货车特有的限高、限重、车型等信息加入到路径规划策略中进行计算。在导航中也会有特有的语音提示和UI提示。

特别注意:货车路径规划是收费接口,您如果申请试用或者正式应用都请通过工单系统提交商务合作类工单进行沟通,否则默认是无法算路成功的。

使用方式和驾车一样,区别就是需要传入车辆类型和详细的车辆信息。 

AMapNaviVehicleInfo *info = [[AMapNaviVehicleInfo alloc] init];
info.vehicleId = "京N66Y66"; //设置车牌号
info.type = 1;              //设置车辆类型,0:小车; 1:货车. 默认0(小车).
info.size = 4;              //设置货车的类型(大小)
info.width = 3;             //设置货车的宽度,范围:[0-25.5],单位:米
info.height = 3.9;          //设置货车的高度,范围:[0-25.5],单位:米
info.length = 15;           //设置货车的长度,范围:[0-25],单位:米
info.load = 50;             //设置货车的总重,即车重+核定载重,范围:[0-6553.5],单位:吨
info.weight = 45;           //设置货车的核定载重,范围:[0-6553.5],单位:吨
info.axisNums = 6;          //设置货车的轴数(用来计算过路费及限重)
[config setVehicleInfo:info];

[self.compositeManager presentRoutePlanViewControllerWithOptions:config];
let config = AMapNaviCompositeUserConfig.init()

let info = AMapNaviVehicleInfo.init()
info.vehicleId = "京N66Y66"; //设置车牌号
info.type = 1;              //设置车辆类型,0:小车; 1:货车. 默认0(小车).
info.size = 4;              //设置货车的类型(大小)
info.width = 3;             //设置货车的宽度,范围:[0-25.5],单位:米
info.height = 3.9;          //设置货车的高度,范围:[0-25.5],单位:米
info.length = 15;           //设置货车的长度,范围:[0-25],单位:米
info.load = 50;             //设置货车的总重,即车重+核定载重,范围:[0-6553.5],单位:吨
info.weight = 45;           //设置货车的核定载重,范围:[0-6553.5],单位:吨
info.axisNums = 6;          //设置货车的轴数(用来计算过路费及限重)
config.setVehicleInfo(info);

self.compositeManager.presentRoutePlanViewController(withOptions: config)

退出导航组件

导航组件调起之后,用户可以点击“路径规划页面”左上角的回退按钮来退出导航组件,开发者也可以根据需要调用如下函数退出导航组件。 

/**
 * @brief 退出导航组件页面 注意:此函数涉及到UI操作,请在主线程中调用,否则无效. since 5.5.0
 * @param animated 是否执行动画
 */
- (void)dismissWithAnimated:(BOOL)animated;

回调方法说明

<AMapNaviCompositeManagerDelegate> 协议提供了一系列回调方法。  

/**
 * @brief 发生错误时,会调用此方法
 * @param compositeManager 导航组件类
 * @param error 错误信息
 */
- (void)compositeManager:(AMapNaviCompositeManager *_Nonnull)compositeManager error:(NSError *_Nonnull)error;

/**
 * @brief 算路成功后的回调函数. since 5.5.0
 * @param compositeManager 导航组件类
 * @param type 路径规划类型,参考 AMapNaviRoutePlanType .
 */
- (void)compositeManager:(AMapNaviCompositeManager *_Nonnull)compositeManager onCalculateRouteSuccessWithType:(AMapNaviRoutePlanType)type;

/**
 * @brief 算路失败后的回调函数,路径规划页面的算路、导航页面的重算等失败后均会调用此方法
 * @param compositeManager 导航组件类
 * @param error 错误信息,error.code参考 AMapNaviCalcRouteState .
 */
- (void)compositeManager:(AMapNaviCompositeManager *_Nonnull)compositeManager onCalculateRouteFailure:(NSError *_Nonnull)error;

/**
 * @brief 开始导航的回调函数
 * @param compositeManager 导航组件类
 * @param naviMode 导航类型,参考 AMapNaviMode .
 */
- (void)compositeManager:(AMapNaviCompositeManager *_Nonnull)compositeManager didStartNavi:(AMapNaviMode)naviMode;

/**
 * @brief 当前位置更新回调(无论是否在导航中,只要当前位置有更新就会回调)
 * @param compositeManager 导航组件类
 * @param naviLocation 当前位置信息,参考 AMapNaviLocation 类
 */
- (void)compositeManager:(AMapNaviCompositeManager *_Nonnull)compositeManager updateNaviLocation:(AMapNaviLocation *_Nullable)naviLocation;

/**
 * @brief 驾车导航页面白天夜间模式切换回调 since 6.7.0
 * @param compositeManager 导航组件类
 * @param showStandardNightType 是否为夜间模式,YES 表示夜间模式,NO 表示白天模式
 */
- (void)compositeManager:(AMapNaviCompositeManager *_Nonnull)compositeManager didChangeDayNightType:(BOOL)showStandardNightType;

/**
 * @brief 导航到达目的地后的回调函数
 * @param compositeManager 导航组件类
 * @param naviMode 导航类型,参考 AMapNaviMode .
 */
- (void)compositeManager:(AMapNaviCompositeManager *_Nonnull)compositeManager didArrivedDestination:(AMapNaviMode)naviMode;

/**
 * @brief 导航组件页面回退或者退出导航组件时会调用此函数 since 5.5.0
 * @param compositeManager 导航组件类
 * @param backwardActionType 导航组件页面回退的动作类型,参考 AMapNaviCompositeVCBackwardActionType .
 */
- (void)compositeManager:(AMapNaviCompositeManager *_Nonnull)compositeManager didBackwardAction:(AMapNaviCompositeVCBackwardActionType)backwardActionType;

/**
 * @brief 每次进入导航组件时和驾车路径规划策略改变均会调用此方法 since 6.1.0
 * @param compositeManager 导航组件类
 * @param driveStrategy 驾车路径规划策略,参考 AMapNaviDrivingStrategy .
 */
- (void)compositeManager:(AMapNaviCompositeManager *_Nonnull)compositeManager onDriveStrategyChanged:(AMapNaviDrivingStrategy)driveStrategy;

/**
 * @brief 导航到达某个途经点的回调函数 since 6.1.0
 * @param compositeManager 导航组件类
 * @param wayPointIndex 到达途径点的编号,标号从0开始. 注意:如果导航过程进行了路径重算(包含偏航、手动刷新等),wayPointIndex会重新从0开始计数
 */
- (void)compositeManager:(AMapNaviCompositeManager *_Nonnull)compositeManager onArrivedWayPoint:(int)wayPointIndex;

/**
 * @brief 导航界面地图的日夜模式设置改变的回调函数. since 7.1.0
 * @param type 参考 AMapNaviViewMapModeType .
 */
- (void)compositeManagerDidChangeMapViewModeType:(AMapNaviViewMapModeType)type;

/**
 * @brief 导航语音播报模式设置改变的回调函数. since 7.1.0
 * @param type 参考 AMapNaviCompositeBroadcastType .
 */
- (void)compositeManagerDidChangeBroadcastType:(AMapNaviCompositeBroadcastType)type;

/**
 * @brief 导航界面跟随模式设置改变的回调函数. since 7.1.0
 * @param mode 参考 AMapNaviViewTrackingMode .
 */
- (void)compositeManagerDidChangeTrackingMode:(AMapNaviViewTrackingMode)mode;

/**
 * @brief 比例尺智能缩放设置改变的回调函数. since 7.1.0
 * @param autoZoomMapLevel 锁车模式下是否为了预见下一导航动作自动缩放地图
 */
- (void)compositeManagerDidChangeAutoZoomMapLevel:(BOOL)autoZoomMapLevel;

以下 3 个回调方法,如果您需要自定义语音合成,才需要实现,如果您想使用导航组件内部的语音合成方案(苹果系统自带的),则不需要实现以下回调:  

/**
 * @brief SDK需要实时的获取是否正在进行导航信息播报,以便SDK内部控制 "导航播报信息回调函数" 的触发时机,避免出现下一句话打断前一句话的情况. 如果需要自定义"导航语音播报"功能,必须实现此代理
 * @param compositeManager 导航组件类
 * @return 返回当前是否正在进行导航信息播报,如一直返回YES,"导航播报信息回调函数"就一直不会触发,如一直返回NO,就会出现语句打断情况,所以请根据实际情况返回。
 */
- (BOOL)compositeManagerIsNaviSoundPlaying:(AMapNaviCompositeManager *_Nonnull)compositeManager;

/**
 * @brief 导航播报信息回调函数,此回调函数需要和compositeManagerIsNaviSoundPlaying:配合使用. 如果需要自定义"导航语音播报"功能,必须实现此代理
 * @param compositeManager 导航组件类
 * @param soundString 播报文字
 * @param soundStringType 播报类型,参考 AMapNaviSoundType. 注意:since 6.0.0 AMapNaviSoundType 只返回 AMapNaviSoundTypeDefault
 */
- (void)compositeManager:(AMapNaviCompositeManager *_Nonnull)compositeManager playNaviSoundString:(NSString *_Nullable)soundString soundStringType:(AMapNaviSoundType)soundStringType;

/**
 * @brief 停止导航语音播报的回调函数,当导航SDK需要停止外部语音播报时,会调用此方法. 如果需要自定义"导航语音播报"功能,必须实现此代理
 * @param compositeManager 导航组件类
 */
- (void)compositeManagerStopPlayNaviSound:(AMapNaviCompositeManager *_Nonnull)compositeManager;

需要注意的是,一定要给-compositeManagerIsNaviSoundPlaying: 返回正确的布尔值。如果一直返回YES,SDK内部会认为外界一直在播报,"-compositeManager:playNaviSoundString:soundStringType" 就会一直不触发,导致无文字吐出;如一直返回NO,文字吐出的频率可能会过快,会出现语句打断的情况,所以请根据实际情况返回。详细的使用方法请参考:官方Demo中的SpeechSynthesizer.m的代码。  

新用户
福利
示例
中心
常见
问题