百度地图集成

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容