说到百度地图,哎,一把血泪史啊。说到百度地图导航功能简直我想哭啊。
当年做一个基于地图的app,本来基本完工了,老大说加个导航吧,我一看老大发话了,加就加呗。老大说给你两天做完吧。当时我就爆发了我的小宇宙啊,什么两天!!! 两天!!! 卧槽,你看不起谁呢!半天!(当年原谅我的年少轻狂,不知天高地厚) 然后牛逼都吹了,就开始做呗。然后我就懵逼了,导入导航sdk,配一下基础环境,这种渣渣的小事,10分钟干掉。就当我想开展下一步的时候,忽然一股血光,出现在我的屏幕上,卧槽,xcode大姨妈了。竟然爆红了。我一看肯定导航sdk有问题啊。心想百度导航页太坑了吧,刚导入就把xcode大姨妈给搞出来了(完了,老司机的驾照暴露了。。。)然后没办法啊,有问题就解决呗。百度一下,官方说sdk跟第三方库冲突,会出问题的第三方库有 MBProgressHUD、AFNetworking。并给了两种解决方案:
一
临时解决方案:把libbaiduNaviSDK.a移到“Linked Frameworks and Libraries”的最后一个。
二
使用v3.0.2,官网上的版本是v3.0.0,论坛的是v3.0.2,并附有下载链接。提示:下载的v3.0.2不带libbaiduNaviSDK.a文件,请将v3.0.0的.a文件拖入工程。
当我性质勃勃的按方案一,做了之后,卧槽坑人啊,不管用啊。。那就方案二吧,结果用公司的龟速网,终于下了200M的3.0.2之后,然后替换完sdk,commit+b,卧槽,又坑我。还是不行啊。
后来发现这两种解决方案,基本看脸啊,谁让我长了一张,遭人嫉妒的脸呢,哎,故意跟我过不去啊。没办法自己解决吧。不就是个编译错误嘛,首先我就把麻痹progres给干掉了。。我的心啊,换上mvprogress,修改N处代码,编译,果然编译错误少了一个,最后爆红在afn的一个文件,此时宝宝已经崩溃了,你不能让我再干掉anf换成asi吧。此时已经临近与组长的半天之约了。一怒之下,把debug模式调成release模式,卧槽奇迹发生了,编译竟然通过了。此时上午结束还有5分钟,然后贴上下面的导航代码搞定。(唉,奉劝各位程序员同仁,努力工作,为了自己吹过的牛逼。。。)
//真实GPS导航
- (void)realNavi
{
if (![self checkServicesInited]) return;
[self startNavi];
}
- (void)startNavi
{
BOOL useMyLocation = YES;
NSMutableArray *nodesArray = [[NSMutableArray alloc]initWithCapacity:2];
//起点 传入的是原始的经纬度坐标,若使用的是百度地图坐标,可以使用BNTools类进行坐标转化
CLLocation *myLocation = [BNCoreServices_Location getLastLocation];
BNRoutePlanNode *startNode = [[BNRoutePlanNode alloc] init];
startNode.pos = [[BNPosition alloc] init];
if (useMyLocation) {
startNode.pos.x = myLocation.coordinate.longitude;
startNode.pos.y = myLocation.coordinate.latitude;
startNode.pos.eType = BNCoordinate_OriginalGPS;
}
else {
startNode.pos.x = 116.;
startNode.pos.y = 22;
startNode.pos.eType = BNCoordinate_BaiduMapSDK;
}
[nodesArray addObject:startNode];
BNRoutePlanNode *endNode = [[BNRoutePlanNode alloc] init];
endNode.pos = [[BNPosition alloc] init];
endNode.pos.x = [mapaccount.longitude doubleValue];
endNode.pos.y = [mapaccount.latitude doubleValue];
endNode.pos.eType = BNCoordinate_BaiduMapSDK;
[nodesArray addObject:endNode];
[BNCoreServices_RoutePlan startNaviRoutePlan:BNRoutePlanMode_Recommend naviNodes:nodesArray time:nil delegete:self userInfo:nil];
}
#pragma mark - BNNaviRoutePlanDelegate
//算路成功回调
-(void)routePlanDidFinished:(NSDictionary *)userInfo
{
NSLog(@"算路成功");
//路径规划成功,开始导航
[BNCoreServices_UI showPage:BNaviUI_NormalNavi delegate:self extParams:nil];
}
//算路失败回调
- (void)routePlanDidFailedWithError:(NSError *)error andUserInfo:(NSDictionary*)userInfo
{
switch ([error code]%10000)
{
case BNAVI_ROUTEPLAN_ERROR_LOCATIONFAILED:
[SVProgressHUD showErrorWithStatus:@"暂时无法获取您的位置,请稍后重试"];
NSLog(@"暂时无法获取您的位置,请稍后重试");
break;
case BNAVI_ROUTEPLAN_ERROR_ROUTEPLANFAILED:
[SVProgressHUD showErrorWithStatus:@"无法发起导航"];
NSLog(@"无法发起导航");
break;
case BNAVI_ROUTEPLAN_ERROR_LOCATIONSERVICECLOSED:
NSLog(@"定位服务未开启,请到系统设置中打开定位服务。");
[SVProgressHUD showErrorWithStatus:@"定位服务未开启"];
break;
case BNAVI_ROUTEPLAN_ERROR_NODESTOONEAR:
NSLog(@"起终点距离起终点太近");
[SVProgressHUD showErrorWithStatus:@"起终点距离太近"];
break;
default:
NSLog(@"算路失败");
[SVProgressHUD showErrorWithStatus:@"算路失败"];
break;
}
}