1.申请密钥(key)
http://lbsyun.baidu.com/apiconsole/key
第一步:打开API控制台,如下图所示:
第二步:点击创建应用,开始申请开发密钥,如下图:
第三步:填写应用名称、应用类型注意选择“iOS SDK”、正确填写安全码,点击确认,系统将会自动帮您生成相应的开发密钥:
在申请开发密钥的时候,需要填写对应工程的安全码。这里的安全码指的是该应用的Bundle Identifier,获取方式如下: Xcode切换到Summary标签查看Bundle Identifier
如下图示:
2.注意事项
1.1 工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm)
1.2 在工程属性中指定编译方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并将其设置为"Objective-C++"
2 在工程属性中显式设定:在Xcode的Project -> Edit Active Target -> Build Setting -> Other Linker Flags中添加-ObjC
3 导入第三方openssl静态库:libssl.a和libcrypto.a(SDK打好的包存放于thirdlib目录下)
4 在"Info.plist"中进行如下配置,否则不能调起百度地图客户端。
5 管理地图的生命周期
-(void)viewWillAppear:(BOOL)animated
{
[_mapView viewWillAppear];
_mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
}
-(void)viewWillDisappear:(BOOL)animated
{
[_mapView viewWillDisappear];
_mapView.delegate = nil; // 不用时,置nil
}
6.在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
7.在info.plist中添加:Bundle display name ,且其值不能为空(Xcode6新建的项目没有此配置,若没有会造成manager start failed)
8.项目中添加mapapi.bundle文件以及添加方法正确
3配置环境
第一步、根据需要导入 .framework包
在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择BaiduMapAPI_**.framework添加到工程中。
第二步、引入所需的系统库
CoreLocation.framework和QuartzCore.framework、OpenGLES.framework、SystemConfiguration.framework、CoreGraphics.framework、Security.framework、libsqlite3.0.tbd(xcode7以前为 libsqlite3.0.dylib)、CoreTelephony.framework 、libstdc++.6.0.9.tbd(xcode7以前为libstdc++.6.0.9.dylib)。
添加方式: 在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加这几个系统库即可。
第三步、引入所需的第三方openssl库:
添加支持HTTPS所需的penssl静态库:libssl.a和libcrypto.a(SDK打好的包存放于thirdlib目录下)
添加方法: 在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中
第四步、环境配置
在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC。
第五步、引入mapapi.bundle资源文件
方法:选中工程名,在右键菜单中选择Add Files to “工程名”…,从BaiduMapAPI_Map.framework||Resources文件中选择mapapi.bundle文件,并勾选“Copy items if needed”复选框,单击“Add”按钮,将资源文件添加到工程中。
第六步、引入头文件在使用SDK的类
按需 引入下边的头文件:
4.集成百度地图的导航功能
1: 在使用该套SDK之前,需先申请密钥(ak)才可使用,接口(除发送短信功能外)无使用次数限制。
2iOS导航SDK资源包
http://lbsyun.baidu.com/index.php?title=ios-navsdk/sdkios-nav-download
3.将SDK和Framework添加进工程
baiduNaviSDK文件夹添加到工程中,把AudioToolbox.framework、ImageIO.framework、CoreMotion.framework、CoreLocation.framework、CoreTelephony.framework、MediaPlayer.framework、AVFoundation.framework、SystemConfiguration.framework、JavaScriptCore.framework、Security.framework 、OpenGLES.framework 、GLKit.framework 、libstdc++6.0.9.dylib、libc++.tbd、libsqlite3.0.tbd、libz.1.2.5.tbd这几个framework添加到工程中
4.修改Build Settings设置项
在Build Settings中, “Other Linker Flags”添加“-ObjC” 标识
5.配置.plist文件
5.appdelegate写入一下代码
#import//引入地图功能所有的头文件#import "BNCoreServices.h"@interface AppDelegate ()//百度地图管理者
@property(nonatomic,strong) BMKMapManager *mapManager;
@end
@implementation AppDelegate
//懒加载
-(BMKMapManager *)mapManager
{
if (_mapManager==nil){
_mapManager=[[BMKMapManager alloc] init];
}
return _mapManager;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 要使用百度地图,请先启动BaiduMapManager
BOOL flag = [self.mapManager start:@"v67SHkNTcSjiKvGoOhBC95m5haIm6bRz" generalDelegate:self];
if (flag == NO) {
NSLog(@"manager start failed!");
}
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
ViewController *vc =[[ViewController alloc] init];
vc.view.backgroundColor = [UIColor whiteColor];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
// 初始化导航SDK
/* TTS授权失败
1.不能使用模拟器
2.项目名称不能为中文(工程->build Setting-> product name)
3.必须开启语音播报功能(添加到一个白名单中)
崩溃原因 View controller-based status bar appearance 设置为NO
*/
[[BNCoreServices GetInstance] initServices:@"v67SHkNTcSjiKvGoOhBC95m5haIm6bRz"];
[[BNCoreServices GetInstance] startServicesAsyn:nil fail:nil];
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
[BMKMapView willBackGround];//当应用即将后台时调用,停止一切调用opengl相关的操作
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[BMKMapView didForeGround];//当应用恢复前台状态时调用,回复地图的渲染和opengl相关的操作
}
@end
6 在调用百度map中使用
#import//引入计算工具所有的头文件#import#import "FAITHBaiDuMapTool.h"@interface ViewController ()/* 地图视图 */@property(nonatomic,weak) BMKMapView *mapView;/* 定位服务 */@property(nonatomic,strong) BMKLocationService *locService ;/* 定位服务 */@property(nonatomic,strong) BMKUserLocation *userLocation ;@end@implementation ViewController-(BMKLocationService *)locService{ if (_locService == nil) { //初始化BMKLocationService _locService = [[BMKLocationService alloc]init]; _locService.delegate = self; //启动LocationService [_locService startUserLocationService]; } return _locService;}- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. BMKMapView *mapView = [[BMKMapView alloc] initWithFrame:[UIScreen mainScreen].bounds]; [self.view addSubview:mapView]; self.mapView = mapView; [self locService]; _mapView.showsUserLocation = NO; _mapView.userTrackingMode = BMKUserTrackingModeFollow; _mapView.showsUserLocation = YES; }-(void)viewWillAppear:(BOOL)animated { [_mapView viewWillAppear]; _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放 _locService.delegate = self;}-(void)viewWillDisappear:(BOOL)animated { [_mapView viewWillDisappear]; _mapView.delegate = nil; // 不用时,置nil _locService.delegate = nil;}/** *在地图View将要启动定位时,会调用此函数 *@param mapView 地图View */- (void)willStartLocatingUser{ NSLog(@"start locate");}/** *用户方向更新后,会调用此函数 *@param userLocation 新的用户位置 */- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation{ [_mapView updateLocationData:userLocation];}/** *用户位置更新后,会调用此函数 *@param userLocation 新的用户位置 */- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{ self.userLocation = userLocation; [_mapView updateLocationData:userLocation]; //设置区域 BMKCoordinateRegion region = BMKCoordinateRegionMake(userLocation.location.coordinate, BMKCoordinateSpanMake(0.01, 0.01)); [_mapView setRegion:region];}/** *在地图View停止定位后,会调用此函数 *@param mapView 地图View */- (void)didStopLocatingUser{ NSLog(@"stop locate");}/** *定位失败后,会调用此函数 *@param mapView 地图View *@param error 错误号,参考CLError.h中定义的错误号 */- (void)didFailToLocateUserWithError:(NSError *)error{ NSLog(@"location error");}- (void)dealloc { if (_mapView) { _mapView = nil; }}/// 长按地图的时候会来到该方法////// - Parameters:/// - mapView: 地图视图/// - coordinate: 点击的经纬度-(void)mapview:(BMKMapView *)mapView onLongClick:(CLLocationCoordinate2D)coordinate{ //进行POI检索 [[FAITHBaiDuMapTool shareInstance] poiSearchWithLocation:coordinate keyword:@"酒店" resultBlock:^(BMKPoiInfo *poiInfos, NSString *error) { if (error != nil) { return ; } for (BMKPoiInfo *poiInfo in poiInfos) { //添加一个PointAnnotation BMKPointAnnotation *annotation = [[BMKPointAnnotation alloc] init]; annotation.coordinate = poiInfo.pt;//该点POI的坐标 annotation.title = poiInfo.name;//该点POI的名称 annotation.subtitle = poiInfo.address;//该点POI的地址 [mapView addAnnotation:annotation]; } }]; //设置区域 BMKCoordinateRegion region = BMKCoordinateRegionMake(coordinate, BMKCoordinateSpanMake(0.05, 0.05)); [mapView setRegion:region]; }/// 当添加一个大头针数据模型的时候,会来到该方法,创建对应的大头针视图并返回////// - Parameters:/// - mapView: 地图视图/// - annotation: 大头针数据模型/// - Returns: 大头针视图-(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id)annotation
{
if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
BMKPinAnnotationView *newAnnotation = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"newAnnotation"];
newAnnotation.pinColor = BMKPinAnnotationColorPurple;
newAnnotation.animatesDrop = YES;
return newAnnotation;
}
return nil;
}
/// 当点击大头针上面的弹框的时候就会来到该方法
///
/// - Parameters:
/// - mapView: 地图视图
/// - view: 大头针视图
-(void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view
{
[[FAITHBaiDuMapTool shareInstance] startNavigationWithView:view userLocation:self.userLocation];
}
FAITHBaiDu地图工具类
#import#import//引入地图功能所有的头文件#import//引入检索功能所有的头文件
@interface FAITHBaiDuMapTool : NSObject
/*
单例模式
*/
+(instancetype)shareInstance;
/*
POI周边检索
*/
-(void)poiSearchWithLocation:(CLLocationCoordinate2D)location keyword:(NSString *)keyword resultBlock:(void (^)(BMKPoiInfo *,NSString *))resultBlock;
/*
POI详情检索
*/
-(void)poiDeatilSearchWithLocation:(CLLocationCoordinate2D)location poiUid:(NSString *)poiUid resultBlock:(void (^)(BMKPoiInfo *,NSString *))resultBlock;
/*
导航
*/
-(void)startNavigationWithView:(BMKAnnotationView *)view userLocation:(BMKUserLocation *)userLocation;
@end
#import "FAITHBaiDuMapTool.h"#import "BNCoreServices.h"@interface FAITHBaiDuMapTool ()@property(nonatomic,strong) BMKPoiSearch *poiSearch;
//block
@property(nonatomic,strong) void(^resultBlock) (BMKPoiInfo *,NSString *);
@end
@implementation FAITHBaiDuMapTool
static FAITHBaiDuMapTool *_instance = nil ;
+(instancetype)shareInstance
{
FAITHBaiDuMapTool *_instance = [[self alloc] init];
return _instance;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[super allocWithZone:zone] init];
});
return _instance;
}
- (id)copyWithZone:(NSZone *)zone{
return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
return _instance;
}
//懒加载:设置检索对象
-(BMKPoiSearch *)poiSearch
{
if (_poiSearch == nil) {
_poiSearch = [[BMKPoiSearch alloc] init];
_poiSearch.delegate = self;
}
return _poiSearch;
}
/**
检索周边的POI
*/
-(void)poiSearchWithLocation:(CLLocationCoordinate2D)location keyword:(NSString *)keyword resultBlock:(void (^)(BMKPoiInfo *,NSString *))resultBlock {
self.resultBlock = resultBlock;
//POI检索-发起检索
BMKNearbySearchOption *nearbySearchOption = [[BMKNearbySearchOption alloc] init];
nearbySearchOption.pageIndex = 0;//检索页
nearbySearchOption.pageCapacity = 20;//检索数量
nearbySearchOption.location = location;//从介个经纬度坐标开始周边搜索
nearbySearchOption.keyword = keyword;//检索关键字
//开始检索
BOOL flag = [self.poiSearch poiSearchNearBy:nearbySearchOption];
if (flag) {
NSLog(@"周边检索发送成功");
}else
{
NSLog(@"周边检索发送失败");
}
}
/**
检索详情的POI
*/
-(void)poiDeatilSearchWithLocation:(CLLocationCoordinate2D)location poiUid:(NSString *)poiUid resultBlock:(void (^)(BMKPoiInfo *,NSString *))resultBlock {
self.resultBlock = resultBlock;
//POI详情检索
BMKPoiDetailSearchOption* poiDeatilSearchOption = [[BMKPoiDetailSearchOption alloc] init];
poiDeatilSearchOption.poiUid = poiUid;//POI搜索结果中获取的uid
BOOL flag = [_poiSearch poiDetailSearch:poiDeatilSearchOption];
if(flag)
{
//详情检索发起成功
}
else
{
//详情检索发送失败
}
}
// MARK:- 导航
/// 开始导航
/// - Parameter view: 大头针视图
-(void)startNavigationWithView:(BMKAnnotationView *)view userLocation:(BMKUserLocation *)userLocation
{
//实现导航功能
//节点数组
NSMutableArray *nodesArray = [NSMutableArray array];
//起点
BNRoutePlanNode *startNode = [[BNRoutePlanNode alloc] init];
startNode.pos = [[BNPosition alloc] init];//起点位置对象
startNode.pos.x = userLocation.location.coordinate.longitude;//经度
startNode.pos.y = userLocation.location.coordinate.latitude;//纬度;
startNode.pos.eType = BNCoordinate_BaiduMapSDK;//坐标类型
[nodesArray addObject:startNode];
//终点
BNRoutePlanNode *endNode = [[BNRoutePlanNode alloc] init];
endNode.pos = [[BNPosition alloc] init];//终点位置
endNode.pos.x = view.annotation.coordinate.longitude;//经度
endNode.pos.y = view.annotation.coordinate.latitude;//纬度;
endNode.pos.eType = BNCoordinate_BaiduMapSDK;
[nodesArray addObject:endNode];
//发起路径规划
//算路方式,定义见BNRoutePlanMode
//naviNodes:算路节点数组,起点、途经点、终点按顺序排列,节点信息为BNRoutePlanNode结构
//naviTime:发起算路时间,用于优化算路结果,可以为nil
//delegate:算路委托,用于回调
//userInfo:用户需要传入的参数
[[BNCoreServices RoutePlanService] startNaviRoutePlan:BNRoutePlanMode_Recommend naviNodes:nodesArray time:nil delegete:self userInfo:nil];
}
// MARK: - BNNaviRoutePlanDelegate
//算路成功回调
-(void)routePlanDidFinished:(NSDictionary *)userInfo
{
[[BNCoreServices UIService] showPage:BNaviUI_NormalNavi delegate:self extParams:nil];
}
//算路失败回调
- (void)routePlanDidFailedWithError:(NSError *)error andUserInfo:(NSDictionary *)userInfo
{
NSLog(@"算路失败");
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(@"算路取消");
}
// MARK: - BNNaviUIManagerDelegate
-(void)onExitPage:(BNaviUIType)pageType extraInfo:(NSDictionary *)extraInfo
{
NSLog(@"退出导航页面");
}
// MARK: - BMKPoiSearchDelegate
/*
周边检索监听结果
*/
-(void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode
{
if(errorCode == BMK_SEARCH_NO_ERROR) {
NSLog(@"检索到了");//处理正常的结果
BMKPoiInfo *poiInfos = (BMKPoiInfo *)poiResult.poiInfoList;
//回调
self.resultBlock(poiInfos,nil);
}else if (errorCode == BMK_SEARCH_AMBIGUOUS_KEYWORD){
//当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表
// result.cityList;
self.resultBlock(nil,@"起始点有歧义");
}else{
self.resultBlock(nil,@"抱歉没找到结果");
}
}
/*
详细检索监听结果
*/
-(void)onGetPoiDetailResult:(BMKPoiSearch *)searcher result:(BMKPoiDetailResult *)poiDetailResult errorCode:(BMKSearchErrorCode)errorCode
{
if(errorCode == BMK_SEARCH_NO_ERROR){
NSLog(@"检索到了");//处理正常的结果
}else if (errorCode == BMK_SEARCH_AMBIGUOUS_KEYWORD){
//当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表
// result.cityList;
// self.resultBlock(nil,@"起始点有歧义");
}else{
// self.resultBlock(nil,@"抱歉没找到结果");
}
}
@end