示例中心
功能在线体验
控制台

高德 开发 iOS 导航SDK 开发指南 导航组件 使用导航组件

更新时间:2018年07月06日

简介

导航组件功能自 iOS 导航 SDK V5.1.0 版本起开始支持。

  • 导航组件是一套有界面封装的导航模块,导航组件的推出给开发者提供了更便捷的方式,将导航能力集成到自己的APP中。导航组件采用与高德地图客户端同样的界面元素与交互方式,定期进行界面元素更新与高德地图客户端保持同步。
  • 导航组件调起方式简单,但无法进行界面的自定义,如果您有一些自定义需求,还是要使用之前的导航View,可以参考导航Demo中的导航UI自定义部分。
  • 导航组件涵盖线路规划起点、终点选择页面,多路线规划选择页面,导航页面。效果如下:

启动导航组件

不传入起点、终点、途径点启动导航组件

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

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

传入起点、途径点、终点启动导航组件

以下内容自 iOS 导航 SDK V5.2.0版本起支持

通过设置起点、途径点(最多支持三个)、终点直接调起路径规划页面;支持通过设置页面调起类型选择方式,当前默认仅可选择驾车导航模式。

一个点数据可以通过经纬度(latlng),名称(name),高德POIId来描述,其参数规则如下:

  • 经纬度数据为必填参数;
  • 名称是可选参数仅用于显示地点名称,如果设置了名称参数,会优先考虑显示所设置的名称,如果不传名称将使用默认值,如“终点”、“途径点1”;
  • 高德POIId是可选参数,如果设置高德POIId数据,启动导航组件时将会使用POIId做POI精确检索,获得的POI出入口信息经纬度以及POI名称会覆盖设置的经纬度(latlng)和名称(name)数据两个参数。
  • 当不设置起点信息时,会采用用户当前位置作为起点,并显示地点名称为“我的位置”。

传入终点坐标和名称,不传高德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];
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];
let config = AMapNaviCompositeUserConfig.init()
config.setRoutePlanPOIType(AMapNaviRoutePlanPOIType.start, location: AMapNaviPoint.location(withLatitude: 40.080525, longitude: 116.603039), name: "北京首都机场", poiId: "B000A28DAE") 
config.setRoutePlanPOIType(AMapNaviRoutePlanPOIType.way, location: AMapNaviPoint.location(withLatitude: 39.941823, longitude: 116.426319), name: "北京大学", poiId: "B000A816R6")      
config.setRoutePlanPOIType(AMapNaviRoutePlanPO

不经过路径规划页面直接发起导航示例:

以下内容自iOS导航SDK5.3.0版本开始支持

AMapNaviCompositeUserConfig *config = [[AMapNaviCompositeUserConfig alloc] init];
//传入终点
[config setRoutePlanPOIType:AMapNaviRoutePlanPOITypeEnd location:[AMapNaviPoint locationWithLatitude:39.918058 longitude:116.397026] name:@"故宫" POIId:nil];  
//直接进入导航界面
[config setStartNaviDirectly:YES];  
[self.compositeManager presentRoutePlanViewControllerWithOptions:config];
let config = AMapNaviCompositeUserConfig.init()
//传入终点
config.setRoutePlanPOIType(AMapNaviRoutePlanPOIType.end, location: AMapNaviPoint.location(withLatitude: 39.918058, longitude: 116.397026), name: "故宫", poiId: nil)  
//直接进入导航界面
config.setStartNaviDirectly(true) 
self.compositeManager.presentRoutePlanViewController(withOptions: config)

导航组件换皮肤示例:

以下内容自iOS导航SDK5.4.0版本开始支持

AMapNaviCompositeUserConfig *config = [[AMapNaviCompositeUserConfig alloc] init];
[config setThemeType:AMapNaviCompositeThemeTypeDark];
[self.compositeManager presentRoutePlanViewControllerWithOptions:config];  
let config = AMapNaviCompositeUserConfig.init()
config.setThemeType(AMapNaviCompositeThemeType.dark)
self.compositeManager.presentRoutePlanViewController(withOptions: config)

组件使用货车导航示例:

以下内容自iOS导航SDK6.0.0版本开始支持。

特别注意:货车路径规划目前默认给出的是测试配额,每日调用次数上限100次,QPS上限1,如果您有更高配额要求,请通过工单系统提交商务合作类工单进行沟通。

AMapNaviCompositeUserConfig *config = [[AMapNaviCompositeUserConfig alloc] init];

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

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

let info = AMapNaviVehicleInfo.init()
info.vehicleId = "京N66Y66";
info.type = 1;
info.size = 4;
info.height = 3.9;
info.length = 15;
info.weight = 50;
info.width = 3;
info.load = 45;
info.axisNums = 6;
config.setVehicleInfo(info);
self.compositeManager.presentRoutePlanViewController(withOptions: config)


可用的回调方法

导航发生错误时的回调:

// 发生错误时,会调用此方法
- (void)compositeManager:(AMapNaviCompositeManager *)compositeManager error:(NSError *)error {
    NSLog(@"error:{%ld - %@}", (long)error.code, error.localizedDescription);
}
func compositeManager(_ compositeManager: AMapNaviCompositeManager, error: Error) {
    let error = error as NSError
    NSLog("error:{%d - %@}", error.code, error.localizedDescription)
}

算路成功后的回调函数,路径规划页面的算路、导航页面的重算等成功后均会调用此方法:

// 算路成功后的回调函数,路径规划页面的算路、导航页面的重算等成功后均会调用此方法
- (void)compositeManagerOnCalculateRouteSuccess:(AMapNaviCompositeManager *)compositeManager {
    NSLog(@"onCalculateRouteSuccess,%ld",(long)compositeManager.naviRouteID);
}
func compositeManager(onCalculateRouteSuccess compositeManager: AMapNaviCompositeManager) {
    NSLog("onCalculateRouteSuccess,%ld", compositeManager.naviRouteID)
}

算路失败后的回调函数,路径规划页面的算路、导航页面的重算等失败后均会调用此方法:

// 算路失败后的回调函数,路径规划页面的算路、导航页面的重算等失败后均会调用此方法
- (void)compositeManager:(AMapNaviCompositeManager *)compositeManager onCalculateRouteFailure:(NSError *)error {
    NSLog(@"onCalculateRouteFailure error:{%ld - %@}", (long)error.code, error.localizedDescription);
}
func compositeManager(_ compositeManager: AMapNaviCompositeManager, onCalculateRouteFailure error: Error) {
    let error = error as NSError
    NSLog("onCalculateRouteFailure error:{%d - %@}", error.code, error.localizedDescription)
}

开始导航的回调函数:

// 开始导航的回调函数
- (void)compositeManager:(AMapNaviCompositeManager *)compositeManager didStartNavi:(AMapNaviMode)naviMode {
    NSLog(@"didStartNavi,%ld",(long)naviMode);
}
func compositeManager(_ compositeManager: AMapNaviCompositeManager, didStartNavi naviMode: AMapNaviMode) {
    NSLog("didStartNavi")
}

当前位置更新回调:

// 当前位置更新回调
- (void)compositeManager:(AMapNaviCompositeManager *)compositeManager updateNaviLocation:(AMapNaviLocation *)naviLocation {
    NSLog(@"updateNaviLocation,%@",naviLocation);
}
func compositeManager(_ compositeManager: AMapNaviCompositeManager, didArrivedDestination naviMode: AMapNaviMode) {
    NSLog("didArrivedDestination")
}

导航到达目的地后的回调函数:

// 导航到达目的地后的回调函数
- (void)compositeManager:(AMapNaviCompositeManager *)compositeManager didArrivedDestination:(AMapNaviMode)naviMode {
    NSLog(@"didArrivedDestination,%ld",(long)naviMode);
}
func compositeManager(_ compositeManager: AMapNaviCompositeManager, update naviLocation: AMapNaviLocation?) {
    NSLog("updateNaviLocation,%@",naviLocation)
}

以下3个回调方法,如果需要自定义语音合成,才需要实现:

// SDK需要实时的获取是否正在进行导航信息播报,需要开发者根据实际播报情况返回布尔值
- (BOOL)compositeManagerIsNaviSoundPlaying:(AMapNaviCompositeManager *)compositeManager {
    return [[SpeechSynthesizer sharedSpeechSynthesizer] isSpeaking];
}
// 导航播报信息回调函数
- (void)compositeManager:(AMapNaviCompositeManager *)compositeManager playNaviSoundString:(NSString *)soundString soundStringType:(AMapNaviSoundType)soundStringType {
    NSLog(@"playNaviSoundString:{%ld:%@}", (long)soundStringType, soundString);
    [[SpeechSynthesizer sharedSpeechSynthesizer] speakString:soundString];
}
// 停止导航语音播报的回调函数,当导航SDK需要停止外部语音播报时,会调用此方法
- (void)compositeManagerStopPlayNaviSound:(AMapNaviCompositeManager *)compositeManager {
    [[SpeechSynthesizer sharedSpeechSynthesizer] stopSpeak];
}
以下3个回调方法,如果需要自定义语音,可开启
func compositeManagerIsNaviSoundPlaying(_ compositeManager: AMapNaviCompositeManager) -> Bool {
    return SpeechSynthesizer.Shared.isSpeaking()
}
    
func compositeManager(_ compositeManager: AMapNaviCompositeManager, playNaviSound soundString: String?, soundStringType: AMapNaviSoundType) {
    if (soundString != nil) {
        SpeechSynthesizer.Shared.speak(soundString!)
    }
}
    
func compositeManagerStopPlayNaviSound(_ compositeManager: AMapNaviCompositeManager) {
    SpeechSynthesizer.Shared.stopSpeak()
}

注意

1、在iOS9、iOS10的系统下,系统 AVSpeechSynthesizer 的语音合成接口存在内存泄漏的情况,由于SDK内部引用了 AVSpeechSynthesizer,所以也会在iOS9和iOS10上出现内存泄漏,您可以使用第三方的语音合成服务,如科大讯飞语音包来规避问题。






移动端
示例中心
功能
在线体验
常见问题