第一遍集成百度导航的时候,遇到一些坑,当时懵懵懂懂的写完了,完全没感觉。
第二次写的时候,还是那些坑,甚至更多了,有必要写一篇文章总结一下。
1、集成导航的SDK
从百度地图api官网下载或者是pod导入都可以。
集成后需要注意的事项:
1、Build Phases->Link Binary With Libraries 展开以后,把libbaiduNaviSDK.a移动到所有sdk的最下方,一定要是最下方!
2、Info->LSApplicationQueriesSchemes中添加一个baidumap字段
Privacy - Location When In Use Usage Description 后面添加内容:只有开启定位功能才能正常使用百度导航
2、申请appKey,去下载SDK的地方申请,如果项目里已经使用百度地图,则可以和地图共用一个key。
3、注册百度语音
搜索百度语音以后,进入百度语音的官网,如图
点击右侧的应用管理
点击管理包名
如上图:选择iOS,并且把项目的Bundle Identifier粘贴到此处。
如果没有做这一步,会提示TTS授权失败。
4、在项目的AppDelegate.m中写如下代码
//初始化导航SDK
[BNCoreServices_Instance initServices:apk];
[BNCoreServices_Instance setTTSAppId:@"此处是百度语音中注册的应用的APP ID"];
[BNCoreServices_Instance startServicesAsyn:nil fail:nil];
5、开始在需要的地方加入导航代码
- (void)naviGoAction{
//节点数组
NSMutableArray *nodesArray = [[NSMutableArray alloc] initWithCapacity:2];
//起点
BNRoutePlanNode *startNode = [[BNRoutePlanNode alloc] init];
startNode.pos = [[BNPosition alloc] init];
startNode.pos.x = 起点的纬度;
startNode.pos.y = 起点的经度;
startNode.pos.eType = BNCoordinate_BaiduMapSDK;
[nodesArray addObject:startNode];
//终点
BNRoutePlanNode *endNode = [[BNRoutePlanNode alloc] init];
endNode.pos = [[BNPosition alloc] init];
endNode.pos.x = 终点的纬度;
endNode.pos.y = 终点的经度;
endNode.pos.eType = BNCoordinate_BaiduMapSDK;
[nodesArray addObject:endNode];
//发起路径规划
[BNCoreServices_RoutePlan startNaviRoutePlan:BNRoutePlanMode_Recommend naviNodes:nodesArray time:nil delegete:self userInfo:nil];
}
#pragma mark BNNaviUIManagerDelegate 算路成功回调
-(void)routePlanDidFinished:(NSDictionary *)userInfo{
NSLog(@"算路成功");
//路径规划成功,开始导航 BN_NaviTypeSimulator 默认模拟导航,BN_NaviTypeReal 真机导航
[BNCoreServices_UI showPage:BNaviUI_NormalNavi delegate:self extParams:nil];
}
//算路失败回调
- (void)routePlanDidFailedWithError:(NSError *)error andUserInfo:(NSDictionary *)userInfo{
NSLog(@"算路失败--%@",error);
switch ([error code]%10000)
{
case BNAVI_ROUTEPLAN_ERROR_LOCATIONFAILED:
NSLog(@"暂时无法获取您的位置,请稍后重试");
break;
case BNAVI_ROUTEPLAN_ERROR_ROUTEPLANFAILED:
NSLog(@"无法发起导航");
break;
case BNAVI_ROUTEPLAN_ERROR_LOCATIONSERVICECLOSED:
NSLog(@"定位服务未开启,请到系统设置中打开定位服务。");
break;
case BNAVI_ROUTEPLAN_ERROR_NODESTOONEAR:
NSLog(@"起终点距离起终点太近");
break;
default:
NSLog(@"算路失败");
break;
}
}
//算路取消
-(void)routePlanDidUserCanceled:(NSDictionary*)userInfo {
NSLog(@"算路取消");
}
如果用户手机上没有安装百度地图app,那么当调起百度地图的时候,会调用如上代码,也就是在你开发的app上进行导航。
如果用户手机上安装了百度地图app,那么如果只写入以上代码,app会自动跳转百度地图app,此时百度地图的起始和终点位置的输入框中显示地图上的点,这样给用户不好的体验。那么以下代码就解决了这个问题
if ( [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://"]]){
NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位置}}&destination=name:%@|latlng:%f,%f&mode=driving",@“此处是目的地的名称”,目的地纬度,目的地经度] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlString];
[[UIApplication sharedApplication] openURL:url];
}
这样的话,显示的时候就是
如果不按照上面代码里面写,画线的两个地方就显示:地图上的点。
这种写法参照百度地图官网解释。
百度地图的集成总是会遇到很多问题,欢迎交流。