1.申請密鑰(key)
http://lbsyun.baidu.com/apiconsole/key
第一步:打開API控制臺闸衫,如下圖所示:
第二步:點擊創(chuàng)建應用慧妄,開始申請開發(fā)密鑰携茂,如下圖:
第三步:填寫應用名稱晦墙、應用類型注意選擇“iOS SDK”虑乖、正確填寫安全碼校坑,點擊確認穷遂,系統(tǒng)將會自動幫您生成相應的開發(fā)密鑰:
在申請開發(fā)密鑰的時候函匕,需要填寫對應工程的安全碼。這里的安全碼指的是該應用的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靜態(tài)庫:libssl.a和libcrypto.a(SDK打好的包存放于thirdlib目錄下)
4 在"Info.plist"中進行如下配置忌穿,否則不能調(diào)起百度地圖客戶端抒寂。
5 管理地圖的生命周期
-(void)viewWillAppear:(BOOL)animated
{
[_mapView viewWillAppear];
_mapView.delegate = self; // 此處記得不用的時候需要置nil,否則影響內(nèi)存的釋放
}
-(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配置環(huán)境
第一步井佑、根據(jù)需要導入 .framework包
在 TARGETS->Build Phases-> Link Binary With Libaries中點擊“+”按鈕,在彈出的窗口中點擊“Add Other”按鈕眠寿,選擇BaiduMapAPI_**.framework添加到工程中躬翁。
第二步、引入所需的系統(tǒng)庫
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,添加這幾個系統(tǒng)庫即可殷费。
第三步印荔、引入所需的第三方openssl庫:
添加支持HTTPS所需的penssl靜態(tài)庫:libssl.a和libcrypto.a(SDK打好的包存放于thirdlib目錄下)
添加方法: 在 TARGETS->Build Phases-> Link Binary With Libaries中點擊“+”按鈕低葫,在彈出的窗口中點擊“Add Other”按鈕,選擇libssl.a和libcrypto.a添加到工程中
第四步仍律、環(huán)境配置
在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)才可使用,接口(除發(fā)送短信功能外)無使用次數(shù)限制份殿。
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];//當應用即將后臺時調(diào)用,停止一切調(diào)用opengl相關的操作
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[BMKMapView didForeGround];//當應用恢復前臺狀態(tài)時調(diào)用泉手,回復地圖的渲染和opengl相關的操作
}
@end
6 在調(diào)用百度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黔寇,否則影響內(nèi)存的釋放? ? _locService.delegate = self;}-(void)viewWillDisappear:(BOOL)animated {? ? [_mapView viewWillDisappear];? ? _mapView.delegate = nil; // 不用時,置nil? ? _locService.delegate = nil;}/** *在地圖View將要啟動定位時斩萌,會調(diào)用此函數(shù) *@param mapView 地圖View */- (void)willStartLocatingUser{? ? NSLog(@"start locate");}/** *用戶方向更新后缝裤,會調(diào)用此函數(shù) *@param userLocation 新的用戶位置 */- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation{? ? [_mapView updateLocationData:userLocation];}/** *用戶位置更新后屏轰,會調(diào)用此函數(shù) *@param userLocation 新的用戶位置 */- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{? ? self.userLocation = userLocation;? ? [_mapView updateLocationData:userLocation];? ? //設置區(qū)域? ? BMKCoordinateRegion region = BMKCoordinateRegionMake(userLocation.location.coordinate, BMKCoordinateSpanMake(0.01, 0.01));? ? [_mapView setRegion:region];}/** *在地圖View停止定位后,會調(diào)用此函數(shù) *@param mapView 地圖View */- (void)didStopLocatingUser{? ? NSLog(@"stop locate");}/** *定位失敗后憋飞,會調(diào)用此函數(shù) *@param mapView 地圖View *@param error 錯誤號霎苗,參考CLError.h中定義的錯誤號 */- (void)didFailToLocateUserWithError:(NSError *)error{? ? NSLog(@"location error");}- (void)dealloc {? ? if (_mapView) {? ? ? ? _mapView = nil;? ? }}/// 長按地圖的時候會來到該方法////// - Parameters:///? - mapView: 地圖視圖///? - coordinate: 點擊的經(jīng)緯度-(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];? ? ? ? }? ? }];? ? ? //設置區(qū)域? ? BMKCoordinateRegion region = BMKCoordinateRegionMake(coordinate, BMKCoordinateSpanMake(0.05, 0.05));? ? [mapView setRegion:region];? }/// 當添加一個大頭針數(shù)據(jù)模型的時候,會來到該方法,創(chuàng)建對應的大頭針視圖并返回////// - Parameters:///? - mapView: 地圖視圖///? - annotation: 大頭針數(shù)據(jù)模型/// - 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檢索-發(fā)起檢索
BMKNearbySearchOption *nearbySearchOption = [[BMKNearbySearchOption alloc] init];
nearbySearchOption.pageIndex = 0;//檢索頁
nearbySearchOption.pageCapacity = 20;//檢索數(shù)量
nearbySearchOption.location = location;//從介個經(jīng)緯度坐標開始周邊搜索
nearbySearchOption.keyword = keyword;//檢索關鍵字
//開始檢索
BOOL flag = [self.poiSearch poiSearchNearBy:nearbySearchOption];
if (flag) {
NSLog(@"周邊檢索發(fā)送成功");
}else
{
NSLog(@"周邊檢索發(fā)送失敗");
}
}
/**
檢索詳情的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)
{
//詳情檢索發(fā)起成功
}
else
{
//詳情檢索發(fā)送失敗
}
}
// MARK:- 導航
/// 開始導航
/// - Parameter view: 大頭針視圖
-(void)startNavigationWithView:(BMKAnnotationView *)view userLocation:(BMKUserLocation *)userLocation
{
//實現(xiàn)導航功能
//節(jié)點數(shù)組
NSMutableArray *nodesArray = [NSMutableArray array];
//起點
BNRoutePlanNode *startNode = [[BNRoutePlanNode alloc] init];
startNode.pos = [[BNPosition alloc] init];//起點位置對象
startNode.pos.x = userLocation.location.coordinate.longitude;//經(jīng)度
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;//經(jīng)度
endNode.pos.y = view.annotation.coordinate.latitude;//緯度;
endNode.pos.eType = BNCoordinate_BaiduMapSDK;
[nodesArray addObject:endNode];
//發(fā)起路徑規(guī)劃
//算路方式,定義見BNRoutePlanMode
//naviNodes:算路節(jié)點數(shù)組榛做,起點叨粘、途經(jīng)點、終點按順序排列瘤睹,節(jié)點信息為BNRoutePlanNode結構
//naviTime:發(fā)起算路時間升敲,用于優(yōu)化算路結果,可以為nil
//delegate:算路委托,用于回調(diào)
//userInfo:用戶需要傳入的參數(shù)
[[BNCoreServices RoutePlanService] startNaviRoutePlan:BNRoutePlanMode_Recommend naviNodes:nodesArray time:nil delegete:self userInfo:nil];
}
// MARK: - BNNaviRoutePlanDelegate
//算路成功回調(diào)
-(void)routePlanDidFinished:(NSDictionary *)userInfo
{
[[BNCoreServices UIService] showPage:BNaviUI_NormalNavi delegate:self extParams:nil];
}
//算路失敗回調(diào)
- (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(@"無法發(fā)起導航");
break;
case BNAVI_ROUTEPLAN_ERROR_LOCATIONSERVICECLOSED:
NSLog(@"定位服務未開啟,請到系統(tǒng)設置中打開定位服務轰传。");
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
/*
周邊檢索監(jiān)聽結果
*/
-(void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode
{
if(errorCode == BMK_SEARCH_NO_ERROR) {
NSLog(@"檢索到了");//處理正常的結果
BMKPoiInfo *poiInfos = (BMKPoiInfo *)poiResult.poiInfoList;
//回調(diào)
self.resultBlock(poiInfos,nil);
}else if (errorCode == BMK_SEARCH_AMBIGUOUS_KEYWORD){
//當在設置城市未找到結果驴党,但在其他城市找到結果時,回調(diào)建議檢索城市列表
// result.cityList;
self.resultBlock(nil,@"起始點有歧義");
}else{
self.resultBlock(nil,@"抱歉沒找到結果");
}
}
/*
詳細檢索監(jiān)聽結果
*/
-(void)onGetPoiDetailResult:(BMKPoiSearch *)searcher result:(BMKPoiDetailResult *)poiDetailResult errorCode:(BMKSearchErrorCode)errorCode
{
if(errorCode == BMK_SEARCH_NO_ERROR){
NSLog(@"檢索到了");//處理正常的結果
}else if (errorCode == BMK_SEARCH_AMBIGUOUS_KEYWORD){
//當在設置城市未找到結果获茬,但在其他城市找到結果時港庄,回調(diào)建議檢索城市列表
// result.cityList;
//? ? ? ? self.resultBlock(nil,@"起始點有歧義");
}else{
//? ? ? ? self.resultBlock(nil,@"抱歉沒找到結果");
}
}
@end