若遇到疑难问题可以去 ios导航SDK 论坛问题 查看和反馈:http://bbs.lbsyun.baidu.com/forum.php?mod=forumdisplay&fid=37
阅读本篇文章之前需要看的文章有:
第一步: 按照开发指南配置好环境 http://lbsyun.baidu.com/index.php?title=ios-navsdk/guide/helloworld
第二步:注册语音播报:SDK内置百度TTS语音播报功能,需要对应用进行授权验证才能够使用,因此需要主动注册应用相关信息。http://lbsyun.baidu.com/index.php?title=ios-navsdk/guide/voice 点击打开链接
第三步:http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=117414&extra=page%3D1 有关第三方库(MBProgressHUD、Reachability)冲突的帖子
v3.0.0的sdk跟一些第三方库(MBProgressHUD、Reachability)冲突,比如会报一些错误:
duplicate symbol _OBJC_CLASS_$_MBRoundProgressView in:
/Users/niezhao/Library/Developer/Xcode/DerivedData/KSCarTuning-fvrfeynuvizhlhhblsqdjqledyuz/Build/Products/Debug-iphoneos/libMBProgressHUD.a(MBProgressHUD.o)
/Users/niezhao/Documents/niefeng/KSCarTuning/KSCarTuning/Source/Utils/Third/BaiduNaviSDK/libbaiduNaviSDK.a(BNMBProgressHUD.o)
duplicate symbol _OBJC_IVAR_$_MBRoundProgressView._annular in:
/Users/niezhao/Library/Developer/Xcode/DerivedData/KSCarTuning-fvrfeynuvizhlhhblsqdjqledyuz/Build/Products/Debug-iphoneos/libMBProgressHUD.a(MBProgressHUD.o)
/Users/niezhao/Documents/niefeng/KSCarTuning/KSCarTuning/Source/Utils/Third/BaiduNaviSDK/libbaiduNaviSDK.a(BNMBProgressHUD.o)
duplicate symbol _OBJC_IVAR_$_MBRoundProgressView._backgroundTintColor in:
/Users/niezhao/Library/Developer/Xcode/DerivedData/KSCarTuning-fvrfeynuvizhlhhblsqdjqledyuz/Build/Products/Debug-iphoneos/libMBProgressHUD.a(MBProgressHUD.o)
/Users/niezhao/Documents/niefeng/KSCarTuning/KSCarTuning/Source/Utils/Third/BaiduNaviSDK/libbaiduNaviSDK.a(BNMBProgressHUD.o)
duplicate symbol _OBJC_IVAR_$_MBRoundProgressView._progress in:
/Users/niezhao/Library/Developer/Xcode/DerivedData/KSCarTuning-fvrfeynuvizhlhhblsqdjqledyuz/Build/Products/Debug-iphoneos/libMBProgressHUD.a(MBProgressHUD.o)
/Users/niezhao/Documents/niefeng/KSCarTuning/KSCarTuning/Source/Utils/Third/BaiduNaviSDK/libbaiduNaviSDK.a(BNMBProgressHUD.o)
duplicate symbol _OBJC_IVAR_$_MBRoundProgressView._progressTintColor in:
/Users/niezhao/Library/Developer/Xcode/DerivedData/KSCarTuning-fvrfeynuvizhlhhblsqdjqledyuz/Build/Products/Debug-iphoneos/libMBProgressHUD.a(MBProgressHUD.o)
/Users/niezhao/Documents/niefeng/KSCarTuning/KSCarTuning/Source/Utils/Third/BaiduNaviSDK/libbaiduNaviSDK.a(BNMBProgressHUD.o)
duplicate symbol _OBJC_METACLASS_$_MBRoundProgressView in:
libMBProgressHUD.a(MBProgressHUD.o)
libbaiduNaviSDK.a(BNMBProgressHUD.o)
duplicate symbol _OBJC_CLASS_$_Reachability in:
/Users/niezhao/Library/Developer/Xcode/DerivedData/KSCarTuning-fvrfeynuvizhlhhblsqdjqledyuz/Build/Intermediates/KSCarTuning.build/Debug-iphoneos/KSCarTuning.build/Objects-normal/armv7/Reachability.o
/Users/niezhao/Documents/niefeng/KSCarTuning/KSCarTuning/Source/Utils/Third/BaiduNaviSDK/libbaiduNaviSDK.a(Reachability.o)
duplicate symbol _OBJC_METACLASS_$_Reachability in:
/Users/niezhao/Library/Developer/Xcode/DerivedData/KSCarTuning-fvrfeynuvizhlhhblsqdjqledyuz/Build/Intermediates/KSCarTuning.build/Debug-iphoneos/KSCarTuning.build/Objects-normal/armv7/Reachability.o
/Users/niezhao/Documents/niefeng/KSCarTuning/KSCarTuning/Source/Utils/Third/BaiduNaviSDK/libbaiduNaviSDK.a(Reachability.o)
duplicate symbol _kReachabilityChangedNotification in:
/Users/niezhao/Library/Developer/Xcode/DerivedData/KSCarTuning-fvrfeynuvizhlhhblsqdjqledyuz/Build/Intermediates/KSCarTuning.build/Debug-iphoneos/KSCarTuning.build/Objects-normal/armv7/Reachability.o
libbaiduNaviSDK.a(Reachability.o)
ld: 11 duplicate symbols for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
v3.0.0的sdk跟一些第三方库(MBProgressHUD、Reachability)冲突,因此紧急制做了一个修正版本,提供云盘下载链接如下:
v3.0.1修正版
链接: https://pan.baidu.com/s/1i5g53GL 密码: 758s
关于和地图sdk在模拟器下编译冲突的问题,有个临时解决方案:
可以把libbaiduNaviSDK.a移到“Linked Frameworks and Libraries”的最后一个,如图:
第四步:写入一下代码
AppDelegate.m 中
#import "BNCoreServices.h"//百度导航
#define BAIDUMAP_APPKEY @"XUz2HUm7Bbj17lHES6B7wIAhYYBUSKi2"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//初始化导航SDK
[BNCoreServices_InstanceinitServices:BAIDUMAP_APPKEY];
[BNCoreServices_InstancestartServicesAsyn:nilfail:nil];
returnYES;
}
KSCVendorMapViewController.m 中
#import "BNCoreServices.h"//百度导航
@interface KSCVendorMapViewController ()<BNNaviRoutePlanDelegate,BNNaviUIManagerDelegate>
@property(nonatomic,assign)CLLocationCoordinate2D targetCoordinate;//应用内百度导航目的地(也就是供销商)经纬度
self.targetCoordinate = annotation.coordinate;//目的地坐标,这里可以替换为你们的目的地坐标
//导航按钮,这里可以替换为你们的导航按钮
[popView.naviButtonaddTarget:selfaction:@selector(startNavi:)forControlEvents:UIControlEventTouchUpInside];
//导航线路
-(void) startNavi: (UIButton*) sender{
if (![selfcheckServicesInited])return;
[selfstartNavi];
}
- (void)startNavi
{
//节点数组
NSMutableArray *nodesArray = [[NSMutableArrayalloc] initWithCapacity:2];
BNRoutePlanNode *startNode = [[BNRoutePlanNodealloc]init];
startNode.pos = [[BNPositionalloc]init];
NSLog(@"百度地图:我的位置:long %f, lat %f",self.userLocation.location.coordinate.longitude,self.userLocation.location.coordinate.latitude);
第一种:以前接过百度地图的可以这样写,但是建议写第二种
// startNode.pos.x = self.userLocation.location.coordinate.longitude;//113.936392;
// startNode.pos.y = self.userLocation.location.coordinate.latitude;//22.547058;
// startNode.pos.eType = BNCoordinate_BaiduMapSDK;
第二种:特别注意**********
CLLocation *myLocation = [BNCoreServices_LocationgetLastLocation]; //这里 [BNCoreServices_LocationgetLastLocation];方法得到的yLocation是原始的经纬度坐标,所以 startNode.pos.eType =BNCoordinate_OriginalGPS; 若使用的是百度地图坐标,可以使用BNTools类进行坐标转化
startNode.pos.x = myLocation.coordinate.longitude;//经度116.339927
startNode.pos.y = myLocation.coordinate.latitude;//纬度 39.947792
NSLog(@"百度地图导航:我的位置:long %f, lat %f",myLocation.coordinate.longitude, myLocation.coordinate.latitude);
//http://api.map.baidu.com/lbsapi/getpoint/index.html坐标反查位置不准确,因为类型为 BNCoordinate_OriginalGPS,而坐标反查的类型为BNCoordinate_BaiduMapSDK
startNode.pos.eType =BNCoordinate_OriginalGPS;
[nodesArray addObject:startNode];
//终点
BNRoutePlanNode *endNode = [[BNRoutePlanNodealloc]init];
endNode.pos = [[BNPositionalloc]init];
endNode.pos.x =self.targetCoordinate.longitude;//114.077075;
endNode.pos.y =self.targetCoordinate.latitude;//22.543634;
endNode.pos.eType =BNCoordinate_BaiduMapSDK;//经试验这里不是BNCoordinate_OriginalGPS
[nodesArray addObject:endNode];
[BNCoreServices_RoutePlan setDisableOpenUrl:YES];//不调用百度地图应用
//打开百度导航UI上的“路况”,此路况针对所有路的路况(包含导航路线之外的道路的路况)
[BNCoreServices_Strategy trySetShowTrafficInNavi:YES success:nil fail:nil];
//发起路径规划
[BNCoreServices_RoutePlan startNaviRoutePlan:BNRoutePlanMode_Recommend naviNodes:nodesArray time:nil delegete:self userInfo:nil];
}
#pragma mark - BNNaviRoutePlanDelegate
//算路成功回调
-(void)routePlanDidFinished:(NSDictionary *)userInfo
{
NSLog(@"算路成功");
//路径规划成功,开始导航
[BNCoreServices_UIshowPage:BNaviUI_NormalNavidelegate:selfextParams:nil];//self 指的是BNNaviUIManagerDelegate
}
//算路失败回调
- (void)routePlanDidFailedWithError:(NSError *)error andUserInfo:(NSDictionary *)userInfo
{
switch ([errorcode]%10000)
{
caseBNAVI_ROUTEPLAN_ERROR_LOCATIONFAILED:
NSLog(@"暂时无法获取您的位置,请稍后重试");
break;
caseBNAVI_ROUTEPLAN_ERROR_ROUTEPLANFAILED:
NSLog(@"无法发起导航");
break;
caseBNAVI_ROUTEPLAN_ERROR_LOCATIONSERVICECLOSED:
NSLog(@"定位服务未开启,请到系统设置中打开定位服务。");
break;
caseBNAVI_ROUTEPLAN_ERROR_NODESTOONEAR:
NSLog(@"起终点距离起终点太近");
break;
default:
NSLog(@"算路失败");
break;
}
}
//算路取消回调
-(void)routePlanDidUserCanceled:(NSDictionary*)userInfo {
NSLog(@"算路取消");
}
#pragma mark - BNNaviUIManagerDelegate
//退出导航页面回调
- (void)onExitPage:(BNaviUIType)pageType extraInfo:(NSDictionary*)extraInfo
{
if (pageType ==BNaviUI_NormalNavi)
{
NSLog(@"退出导航");
}
elseif (pageType ==BNaviUI_Declaration)
{
NSLog(@"退出导航声明页面");
}
}
- (BOOL)checkServicesInited
{
if(![BNCoreServices_InstanceisServicesInited])
{
UIAlertView *alertView = [[UIAlertViewalloc]initWithTitle:@"提示"
message:@"引擎尚未初始化完成,请稍后再试"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
returnNO;
}
returnYES;
}