iOS开发,sdk是一款针对在线导航的产品这句话什么意思
发布网友
发布时间:2022-04-27 06:18
我来回答
共1个回答
热心网友
时间:2022-06-27 13:15
百度地图API如何选择,以及关于百度地图的SDK的使用,可以参考我之前的一篇文章http://blog.sina.com.cn/s/blog_68661bd80101k4rx.html 在那篇的教程中已经讲解过如何申请百度密钥,这里就不再细说。
导航的功能其实较专一和简单。一般项目使用导航SDK的都是使用当前手机位置到目的地的语音导航。所以掌握这个,也就掌握了整个百度导航SDK。
百度导航:通过调用导航SDK接口,您可以轻松访问百度导航的服务和数据,构建功能丰富、交互性强的导航类应用程序。百度导航功能:1.GPS导航 2.路线全览 3.文字导航 4.HUD导航 5.语音播报 6.实时路况 7.路线规划 8.GPS巡航。从整个功能上来说,就比地图SDK多两个功能:第一,语音导航。由第三条和第五条组成。第二,加了导航界面,提前的路况查询。路线规划这些功能地图SDK已经有了,所以说白了导航SDK只是地图SDK的补充。主要由于地图SDK没有语音导航功能才开发的导航SDK。
在自己项目中使用百度导航SDK的步骤:
第一步:申请密钥。http://lbsyun.baidu.com/apiconsole/key 。在这里也回答一个朋友的问题,能否在同一个工程中同时使用导航SDK和地图SDK。答案是可以的。下面是百度官方的截图。
第二步:下载SDK。百度导航SDK的下载地址http://developer.baidu.com/map/index.php?title=ios-navsdk/sdkios-nav-download 下载的包有开发文档和SDK以及demo程序。
第三步:根据申请密钥时的bundle indentifer创建一个项目。我的项目名为csctest,因为我写的项目的签名为com.calinks.csctest。将当前最新SDK文件夹BaiNavi_iOSSDK_v2.0.4_Lib加入到项目中,如果此刻运行程序会出现错误。因为现在项目一般都是用ARC,而导航SDK中提供的TouchJSON是非ARC编译选项。所以要在Build Phases的Compile Sources中关于TouchJSON的文件的Compiler Flags添加-fno-objc-arc。
第四步:加入库的头文件。此时运行程序不会报错。接下来一般的思路就是加入库的头文件,在AppDelegate.m中加入
#import "BNCoreServices.h"。
在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中加入
[BNCoreServices_Instance initServices: @"itIDWOfDPlQo5camfY5GeqOK"];
[BNCoreServices_Instance startServicesAsyn:nil fail:nil];
此时运行,会有一百多个错误。因为需要加入导航SDK的一些依赖库。必须加入CoreTelephony.framework,libstdc++.6.0.9.tbd,
AVFoundation.framework,CoreMotion.framework,ImageIO.framework,AudioToolbox.framework,SystemConfiguration.framework。
再运行发现还是有错,因为语法错误。
_OBJC_CLASS_$_NSManagedObjectModel", referenced from:
objc-class-ref in libNaviSDK.a(BDETTSCoreDataHelper.o)
"_OBJC_CLASS_$_NSFetchRequest", referenced from:
objc-class-ref in libNaviSDK.a(BDETTSCoreDataHelper.o)
"_OBJC_CLASS_$_NSManagedObjectContext", referenced from:
objc-class-ref in libNaviSDK.a(BDETTSCoreDataHelper.o)
"_OBJC_CLASS_$_NSPersistentStoreCoordinator", referenced from:
objc-class-ref in libNaviSDK.a(BDETTSCoreDataHelper.o)
"_OBJC_CLASS_$_NSAttributeDescription", referenced from:
objc-class-ref in libNaviSDK.a(BDETTSCoreDataHelper.o)
"_OBJC_CLASS_$_NSEntityDescription", referenced from:
objc-class-ref in libNaviSDK.a(BDETTSCoreDataHelper.o)
"_NSSQLiteStoreType", referenced from:
-[BDETTSCoreDataHelper setupPersistentStore] in libNaviSDK.a(BDETTSCoreDataHelper.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
因为导航SDK的语法关系,需要在Build Settings中, “Other Linker Flags”添加“-ObjC” 标识。再运行,程序就没有问题了。注意添加时,O和C是大写,一个字母不对就会出错。
第五步:设置info.plist。一般思路,接下来当然是加导航代码,但是还得意识到一个问题,导航需要定位,因为真正的导航是从自己当前位置为起点的。
为了对iOS8的定位能力做兼容,做了相应的修改,开发者在使用过程中注意事项如下: 需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述。
还有一点,导航要能在后台一直运行。需要加入
第六步:注意初始化失败的问题。加入导航代码时,不要在程序启动时立即直接进入导航功能,因为导航初始化需要时间,在实际情况下也不需要程序启动时立即进入导航功能,因为要输入终点。所以,我建议写一个按钮,点击再进入导航。以免提示@"引擎尚未初始化完成,请稍后再试"
第七步:导航的功能代码
在ViewController.m中加入
#import "BNCoreServices.h",#import "BNRoutePlanModel.h",#import "BNCoreServices.h"。实现<</span>BNNaviUIManagerDelegate,BNNaviRoutePlanDelegate>两个委托方法。主要代码
//发起导航
- (void)startNavi
{
//节点数组
NSMutableArray *nodesArray = [[NSMutableArray alloc] initWithCapacity:2];
//起点
BNRoutePlanNode *startNode = [[BNRoutePlanNode alloc] init];
startNode.pos = [[BNPosition alloc] init];
startNode.pos.x = 113.936392;
startNode.pos.y = 22.547058;
startNode.pos.eType = BNCoordinate_BaiMapSDK;
[nodesArray addObject:startNode];
//终点
BNRoutePlanNode *endNode = [[BNRoutePlanNode alloc] init];
endNode.pos = [[BNPosition alloc] init];
endNode.pos.x = 114.077075;
endNode.pos.y = 22.543634;
endNode.pos.eType = BNCoordinate_BaiMapSDK;
[nodesArray addObject:endNode];
//发起路径规划
[BNCoreServices_RoutePlan startNaviRoutePlan:BNRoutePlanMode_Recommend naviNodes:nodesArray time:nildelegete:self userInfo:nil];
}
//算路成功回调
-(void)routePlanDidFinished:(NSDictionary *)userInfo
{
NSLog(@"算路成功");
//路径规划成功,开始导航
[BNCoreServices_UI showNaviUI: BN_NaviTypeReal delegete:self isNeedLandscape:YES];
}
//算路失败回调
- (void)routePlanDidFailedWithError:(NSError *)error andUserInfo:(NSDictionary *)userInfo
{
NSLog(@"算路失败");
if ([error code] == BNRoutePlanError_LocationFailed) {
NSLog(@"获取地理位置失败");
}
else if ([error code] == BNRoutePlanError_LocationServiceClosed)
{
NSLog(@"定位服务未开启");
}
}
//算路取消回调
-(void)routePlanDidUserCanceled:(NSDictionary*)userInfo {
NSLog(@"算路取消");
}
#pragma mark - BNNaviUIManagerDelegate
//退出导航回调
-(void)onExitNaviUI:(NSDictionary*)extraInfo
{
NSLog(@"退出导航");
}
- (IBAction)StartNavAction:(id)sender {
if (![self checkServicesInited]) return;
_naviType = BN_NaviTypeReal;
[self startNavi];
}
第八步:百度语音授权。http://app.navi.baidu.com/ttsregister/appinfo然而就在信心满满,以为可以语音导航的时候,突然弹出个提示并没有语音导航功能出来。因为还需要一个百度语音授权。填写Bundle Id和对应的密钥AK,再运行程序,就可以正常使用了。