集成百度地图SDK--简单集成
近来比较闲 想试试百度地图SDK。个人感觉集成第三方的SDK基本方法一致,一般都在APPDelegate中注册请求授权(appKey),然后再在具体的类中使用某些方法。也许有些第三方文档中介绍的不是很详细或者某些介绍我们没有很好地理解在集成的过程中会出现些问题,但好在"百度或Google是最好的老师",依托强大的搜索功能,我们可以从前人那里得到很多有用的经验。
大部分跟着文档走就可以了,好多代码都是直接拷贝文档中介绍的
首先搜索打开百度地图开放平台
屏幕快照 2017-05-12 15.10.10.png然后打开开发-->iOS地图SDK,如果要集成其他服务,则可以选择其他服务SDK。
643F60A6-1FC3-43D8-A5BC-22EC34792891.png下载SDK:
进入以后,看到相关下载,点击它,下载SDK
我这里点的全部下载
8491C702-E8EE-4876-BF1A-7C6F2DEC2234.png创建应用、获取appKey:
第三方都会有密钥,这里也是,点击左边的获取密钥,然后点击创建应用。
填写应用名称、选择应用类型(这里选择iOS SDK),应用服务中哪些不需要可去除勾选,安全码即是你应用的bundle identifier。然后提交即可
我的结果:
屏幕快照 2017-05-12 15.26.35.png开发指南:
然后根据开发指南文档去集成相关服务功能。需要注意其中的注意事项和配置开发环境
我采用的是手动配置.framework形式开发包
注意事项中第一条和配置开发环境中第一步:静态库中采用ObjectC++实现,因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm),或者在工程属性中指定编译方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并将其设置为"Objective-C++";可是我根据后者方法,编译报错,而根据前者将任意一个.m文件修改为.mm则可以,不清楚什么原因。
配置开发环境中第六步、引入头文件
在使用SDK的类 按需 引入下边的头文件:
#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>//只引入所需的单个头文件
直接拷贝它们,然后放到APPDelegate.m和相关控制器中。
Hello BaiduMap中的创建BMKMapView:
在您的ViewController.m文件中添加BMKMapView的创建代码,示例如下
- (void)viewDidLoad {
[super viewDidLoad];
BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
self.view = mapView;
}
自2.0.0起,BMKMapView新增viewWillAppear、viewWillDisappear方法来控制BMKMapView的生命周期,并且在一个时刻只能有一个BMKMapView接受回调消息,因此在使用BMKMapView的viewController中需要在viewWillAppear、viewWillDisappear方法中调用BMKMapView的对应的方法,并处理delegate,代码如下:
-(void)viewWillAppear:(BOOL)animated
{
[_mapView viewWillAppear];
_mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
}
-(void)viewWillDisappear:(BOOL)animated
{
[_mapView viewWillDisappear];
_mapView.delegate = nil; // 不用时,置nil
}
你会发现ViewDidLoad中mapView为局部变量,而viewWillAppear:和viewWillDisappear:中却是全局变量,这里可在@interface处声明为全局变量,再修改viewDidLoad代码。
至此,其他配置根据文档中操作就可以编译运行成功了。
注: 开发指南中有一项检索功能,其中有一项功能为POI检索,使用此功能需要遵守BMKPoiSearchDelegate协议,并且也要在@interface处声明一个全局变量。运行发现,总会提示"周边检索发送失败",打印错误码则为10,即
BMK_SEARCH_PERMISSION_UNFINISHED,///还未完成鉴权,请在鉴权通过后重试
即在AppDelegate中还未权鉴完成,这边就已经发了请求。因此,在代码中延迟POI请求的时机就可解决。