一:到百度地图官网 http://lbsyun.baidu.com 下载BaiduMap_IOSSDK_v3,再集成百度地图到应用中,目前下载的是最新版的SDK3.3.2版
二:下载好之后,将其导入到项目中,再根据文档进行以下操作
首先获取密钥 http://lbsyun.baidu.com/apiconsole/key <和项目的bundle ID 相关,所以一个密钥最好只关联一个项目>,得到的AK就是我们所需要的密钥
需求注意以下事项:
- 静态库中采用ObjectC++实现,因此需要您保证您工程中至少有一个.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,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(SDK打好的包存放于thirdlib目录下)
添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。 - 如果在iOS9中使用了调起百度地图客户端功能,必须在"Info.plist"中进行如下配置,否则不能调起百度地图客户端。
LSApplicationQueriesSchemes
baidumap
- 自iOS SDK v2.5.0起,为了对iOS8的定位能力做兼容,做了相应的修改,开发者在使用过程中注意事项如下:
需要在info.plist里添加(以下二选一,两个都添加默认使用使用第一个):
NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述 - 在使用Xcode6进行SDK开发过程中,需要在info.plist中添加:Bundle display name ,且其值不能为空(Xcode6新建的项目没有此配置,若没有会造成manager start failed)
三:手动配置.framework形式开发包
导入下载好的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)。
(注:后面三个系统库为v2.9.0新增的系统库,使用v2.9.0及以上版本的地图SDK,务必增加导入这3个系统库。)
添加方式: 在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加这几个系统库即可。引入头文件(按需引入即可)
#import//引入base相关所有的头文件
#import//引入地图功能所有的头文件
#import//引入检索功能所有的头文件
#import//引入云检索功能所有的头文件
#import//引入定位功能所有的头文件
#import//引入计算工具所有的头文件
#import//引入周边雷达功能所有的头文件
#import//只引入所需的单个头文件
四:可以开始开发了。。。
1 > 在AppDelegate里面初始化BMKMapManager
mapManager = [[BMKMapManager alloc] init];
BOOL ret = [mapManager start:@"在此处输入您的授权Key" generalDelegate:nil];
if (!ret) {
NSLog(@"manager start failed");
}
2 > 创建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; }
运行程序可以看到如下界面,地图雏形已经有了
五 :接下来实现地图的定位功能
1 > 定位显示类型
目前为止,BMKMapView的定位模式(userTrackingMode)有4种分别是:
- BMKUserTrackingModeNone :普通定位模式,显示我的位置,我的位置图标和地图都不会旋转
- BMKUserTrackingModeFollow : 定位跟随模式,我的位置始终在地图中心,我的位置图标会旋转,地图不会旋转
- BMKUserTrackingModeFollowWithHeading : 定位罗盘模式,我的位置始终在地图中心,我的位置图标和地图都会跟着旋转
- BMKUserTrackingModeHeading:普通定位+定位罗盘模式,显示我的位置,我的位置始终在地图中心,我的位置图标会旋转,地图不会旋转。即在普通定位模式的基础上显示方向。
2 > 获取位置信息
-
初始化定位
_locationService = [[BMKLocationService alloc] init]; //定位服务Delegate,调用startUserLocationService定位成功后,用此Delegate来获取定位数据 //(在视图将要消失的方法里置nil) _locationService.delegate = self; _mapView.showsUserLocation = NO;//先关闭显示的定位图层 _mapView.userTrackingMode = BMKUserTrackingModeNone;//设置定位的状态 _mapView.showsUserLocation = YES;//显示定位图层 [_locationService startUserLocationService];
-
实现定位的代理方法,获取定位数据
#pragma mark -- BMKLocationServiceDelegate //用户方向更新后,调用此函数 - (void)didUpdateUserHeading:(BMKUserLocation *)userLocation{ NSLog(@"heading is %@",userLocation.heading); [_mapView updateLocationData:userLocation]; } //用户位置更新后,调用此函数 - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{ [_mapView updateLocationData:userLocation];
-
打印的是这样的经纬度数据,我们难以明白是具体的哪个地方,所以需要进行地理反编码
3 > 获取坐标进行地理反编码
-
初始化地理编码主类
//初始化地理编码主类,用来查询、返回结果信息 _geocodesearch = [[BMKGeoCodeSearch alloc] init]; _geocodesearch.delegate = self;
-
在获取地理坐标位置的代理函数里面更新
//用户位置更新后,调用此函数 - (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检索发送成功"); [_locationService stopUserLocationService]; }else{ NSLog(@"反geo检索发送失败"); } }
-
地址反编码
#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); }
-
定位成功,截图如下
六 :接下来实现地图的三种形式的转换
1 > 切换为卫星地图
//切换为卫星图
[_mapView setMapType:BMKMapTypeSatellite];
2 > 空白地图
//设置地图为空白类型
_mapView.mapType = BMKMapTypeNone;
3 > 标准地图
_mapView.mapType = BMKMapTypeStandard;