一:到百度地圖官網(wǎng) http://lbsyun.baidu.com 下載BaiduMap_IOSSDK_v3,再集成百度地圖到應用中喉童,目前下載的是最新版的SDK3.3.2版
二:下載好之后,將其導入到項目中顿天,再根據(jù)文檔進行以下操作
首先獲取密鑰 http://lbsyun.baidu.com/apiconsole/key <和項目的bundle ID 相關堂氯,所以一個密鑰最好只關聯(lián)一個項目>,得到的AK就是我們所需要的密鑰
需求注意以下事項:
- 靜態(tài)庫中采用ObjectC++實現(xiàn)牌废,因此需要您保證您工程中至少有一個.mm后綴的源文件(您可以將任意一個.m后綴的文件改名為.mm)咽白,或者在工程屬性中指定編譯方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As鸟缕,并將其設置為"Objective-C++"
- 如果您只在Xib文件中使用了BMKMapView晶框,沒有在代碼中使用BMKMapView,編譯器在鏈接時不會鏈接對應符號懂从,需要在工程屬性中顯式設定:在Xcode的Project -> Edit Active Target -> Build Setting -> Other Linker Flags中添加-ObjC
- 授權Key的申請:新授段、舊Key之間不可通用
- 自v3.2.0起,百度地圖iOS SDK全面支持HTTPS番甩,需要廣大開發(fā)者導入第三方openssl靜態(tài)庫:libssl.a和libcrypto.a(SDK打好的包存放于thirdlib目錄下)
添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中點擊“+”按鈕侵贵,在彈出的窗口中點擊“Add Other”按鈕,選擇libssl.a和libcrypto.a添加到工程中 缘薛。 - 如果在iOS9中使用了調起百度地圖客戶端功能窍育,必須在"Info.plist"中進行如下配置,否則不能調起百度地圖客戶端宴胧。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>baidumap</string>
</array> - 自iOS SDK v2.5.0起漱抓,為了對iOS8的定位能力做兼容,做了相應的修改恕齐,開發(fā)者在使用過程中注意事項如下:
需要在info.plist里添加(以下二選一辽旋,兩個都添加默認使用使用第一個):
NSLocationWhenInUseUsageDescription ,允許在前臺使用時獲取GPS的描述
NSLocationAlwaysUsageDescription ,允許永久使用GPS的描述 - 在使用Xcode6進行SDK開發(fā)過程中补胚,需要在info.plist中添加:Bundle display name 码耐,且其值不能為空(Xcode6新建的項目沒有此配置,若沒有會造成manager start failed)
三:手動配置.framework形式開發(fā)包
導入下載好的SDK
添加額外需要的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)契沫。
(注:后面三個系統(tǒng)庫為v2.9.0新增的系統(tǒng)庫,使用v2.9.0及以上版本的地圖SDK昔汉,務必增加導入這3個系統(tǒng)庫懈万。)
添加方式: 在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加這幾個系統(tǒng)庫即可靶病。引入頭文件(按需引入即可)
#import <BaiduMapAPI_Base/BMKBaseComponent.h> //引入base相關所有的頭文件
#import <BaiduMapAPI_Map/BMKMapComponent.h> //引入地圖功能所有的頭文件
#import <BaiduMapAPI_Search/BMKSearchComponent.h> //引入檢索功能所有的頭文件
#import <BaiduMapAPI_Cloud/BMKCloudSearchComponent.h> //引入云檢索功能所有的頭文件
#import <BaiduMapAPI_Location/BMKLocationComponent.h> //引入定位功能所有的頭文件
#import <BaiduMapAPI_Utils/BMKUtilsComponent.h> //引入計算工具所有的頭文件
#import <BaiduMapAPI_Radar/BMKRadarComponent.h> //引入周邊雷達功能所有的頭文件
#import <BaiduMapAPI_Map/BMKMapView.h> //只引入所需的單個頭文件
四:可以開始開發(fā)了会通。。娄周。
1 > 在AppDelegate里面初始化BMKMapManager
mapManager = [[BMKMapManager alloc] init];
BOOL ret = [mapManager start:@"在此處輸入您的授權Key" generalDelegate:nil];
if (!ret) {
NSLog(@"manager start failed");
}
2 > 創(chuàng)建BMKMapView
-
在viewDidLoad里面
//初始化地圖 _mapView = [[BMKMapView alloc] initWithFrame:CGRectMake(0, 0, mapScreenW, mapScreenH)]; [self.view addSubview:_mapView];
-
地圖View的Delegate涕侈,此處記得不用的時候需要置nil,否則影響內存的釋放
-(void)viewWillAppear:(BOOL)animated{ [_mapView viewWillAppear]; _mapView.delegate = self; } -(void)viewDidDisappear:(BOOL)animated{ [_mapView viewWillDisappear]; _mapView.delegate = nil; }
運行程序可以看到如下界面煤辨,地圖雛形已經(jīng)有了
五 :接下來實現(xiàn)地圖的定位功能
1 > 定位顯示類型
目前為止裳涛,BMKMapView的定位模式(userTrackingMode)有4種分別是:
- BMKUserTrackingModeNone :普通定位模式,顯示我的位置众辨,我的位置圖標和地圖都不會旋轉
- BMKUserTrackingModeFollow : 定位跟隨模式端三,我的位置始終在地圖中心,我的位置圖標會旋轉泻轰,地圖不會旋轉
- BMKUserTrackingModeFollowWithHeading : 定位羅盤模式技肩,我的位置始終在地圖中心且轨,我的位置圖標和地圖都會跟著旋轉
- BMKUserTrackingModeHeading:普通定位+定位羅盤模式浮声,顯示我的位置,我的位置始終在地圖中心旋奢,我的位置圖標會旋轉泳挥,地圖不會旋轉。即在普通定位模式的基礎上顯示方向至朗。
2 > 獲取位置信息
-
初始化定位
_locationService = [[BMKLocationService alloc] init]; //定位服務Delegate,調用startUserLocationService定位成功后屉符,用此Delegate來獲取定位數(shù)據(jù) //(在視圖將要消失的方法里置nil) _locationService.delegate = self; _mapView.showsUserLocation = NO;//先關閉顯示的定位圖層 _mapView.userTrackingMode = BMKUserTrackingModeNone;//設置定位的狀態(tài) _mapView.showsUserLocation = YES;//顯示定位圖層 [_locationService startUserLocationService];
-
實現(xiàn)定位的代理方法,獲取定位數(shù)據(jù)
#pragma mark -- BMKLocationServiceDelegate //用戶方向更新后,調用此函數(shù) - (void)didUpdateUserHeading:(BMKUserLocation *)userLocation{ NSLog(@"heading is %@",userLocation.heading); [_mapView updateLocationData:userLocation]; } //用戶位置更新后矗钟,調用此函數(shù) - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{ [_mapView updateLocationData:userLocation];
-
打印的是這樣的經(jīng)緯度數(shù)據(jù)唆香,我們難以明白是具體的哪個地方,所以需要進行地理反編碼
3 > 獲取坐標進行地理反編碼
-
初始化地理編碼主類
//初始化地理編碼主類吨艇,用來查詢躬它、返回結果信息 _geocodesearch = [[BMKGeoCodeSearch alloc] init]; _geocodesearch.delegate = self;
-
在獲取地理坐標位置的代理函數(shù)里面更新
//用戶位置更新后,調用此函數(shù) - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{ [_mapView updateLocationData:userLocation]; NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude); //更新當前位置到地圖中間 _mapView.centerCoordinate = userLocation.location.coordinate; //地理反編碼 BMKReverseGeoCodeOption *reverseGeocodeSearchOption = [[BMKReverseGeoCodeOption alloc]init]; reverseGeocodeSearchOption.reverseGeoPoint = userLocation.location.coordinate; BOOL flag = [_geocodesearch reverseGeoCode:reverseGeocodeSearchOption]; if(flag){ NSLog(@"反geo檢索發(fā)送成功"); [_locationService stopUserLocationService]; }else{ NSLog(@"反geo檢索發(fā)送失敗"); } }
-
地址反編碼
#pragma mark 地理反編碼的 -- BMKGeoCodeSearchDelegate -(void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error{ NSLog(@"address:%@----%@",result.addressDetail,result.address); //addressDetail: 層次化地址信息 //address: 地址名稱 //businessCircle: 商圈名稱 // location: 地址坐標 // poiList: 地址周邊POI信息东涡,成員類型為BMKPoiInfo } //定位失敗 - (void)didFailToLocateUserWithError:(NSError *)error{ NSLog(@"error:%@",error); }
-
定位成功冯吓,截圖如下
六 :接下來實現(xiàn)地圖的三種形式的轉換
1 > 切換為衛(wèi)星地圖
//切換為衛(wèi)星圖
[_mapView setMapType:BMKMapTypeSatellite];
2 > 空白地圖
//設置地圖為空白類型
_mapView.mapType = BMKMapTypeNone;
3 > 標準地圖
_mapView.mapType = BMKMapTypeStandard;