一、开发环境
xcode7+ios9
二、准备工作
1.下载百度地图SDK。直接点:相关SDK下载 ,地址失效的话,百度搜索百度地图api,进入百度开发平台,进行下载。目前最新版本 iOS SDK 2.10.2。
百度官方SDK文档:官方SDK文档 。文档很详细了,不过有些说明是很多年前写的了,不太适用,容易多走一些弯路,本文的出发点也是个人总结,也留个备份,免得以后有需要的时候,自己一些细节又忘了。
2.申请密钥appKey.
百度开发平台,进去点击申请密钥按钮,接着点击创建应用。
注意:安全码和你项目的info.plist的Bundle Identifier值保持一致。
三、配置开发环境
1.新建一个项目,配置info.plist
1.1修改项目的info.plist的Bundle Identifier值和你创建应用的安全码保持一致。
1.2由于iOS9改用更安全的https,为了能够在iOS9中正常使用地图SDK,请在"Info.plist"中进行如下配置,否则影响SDK的使用。
<key>NSAppTransportSecurity</key>
<dict> <key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2.适配iOS8.0以上的定位,需要在info.plist里添加
<key>NSLocationAlwaysUsageDescription</key>
<true/>
<key>NSLocationWhenInUseUsageDescription</key>
<true/>
3.根据需要导入 .framework包
百度地图 iOS SDK 采用分包的形式提供 .framework包,请广大开发者使用时确保各分包的版本保持一致。其中BaiduMapAPI_Base.framework为基础包,使用SDK任何功能都需导入,其他分包可按需导入。
将所需的BaiduMapAPI_**.framework拷贝到工程所在文件夹下。
在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择BaiduMapAPI_**.framework添加到工程中。
注: 静态库中采用Objective-C++实现,因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm),或者在工程属性中指定编译方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并将其设置为"Objective-C++"
4.引入所需的系统库
百度地图全部api一共有7个,另外导入系统自带的12个,共19个。
lib.png
注:用Finder打开显示你的工程,在工程目录下新建一个文件夹BaiduMapAPI,
把你需要的包拷贝到这个目录下,一共7个,我就全部拷贝,然后拖到这个文件夹到xcode工程中。然后在TARGETS->Build Settings->Headers search paths中添加路径:$(SRCROOT)/BaiduMapAPI/
TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮添加另外的12个,最后在xcode工程目录下新建文件夹framework,把12个拖进里面,让项目整洁。
5.AppDelegate.h文件代码
#import <BaiduMapAPI_Base/BMKBaseComponent.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
UINavigationController *navigationController;
BMKMapManager* _mapManager;
}
6.AppDelegate.m文件代码
#import <BaiduMapAPI_Map/BMKMapComponent.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 要使用百度地图,请先启动BaiduMapManager。(XXX是你去百度开放平台创建的应用appKey)
_mapManager = [[BMKMapManager alloc]init];
BOOL ret = [_mapManager start:@"XXX" generalDelegate:self];
if (!ret) {
NSLog(@"manager start failed!");
}
[self.window addSubview:navigationController.view];
[self.window makeKeyAndVisible];
return YES;
}
//网络检查
- (void)onGetNetworkState:(int)iError
{
if (iError) {
NSLog(@"%d", iError);
} else {
NSLog(@"网络连接成功");
}
}
- (void)onGetPermissionState:(int)iError
{
if (iError) {
NSLog(@"授权错误%d", iError);
} else {
NSLog(@"授权状态");
}
}
7.ViewController.mm文件
- (void)loadView
{
BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame];
self.view = mapView;
self.mapView = mapView;
}
- (void)viewWillAppear:(BOOL)animated
{
[_mapView viewWillAppear];
_mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
}
- (void)viewWillDisappear:(BOOL)animated
{
[_mapView viewWillDisappear];
_mapView.delegate = nil; // 不用时,置nil
}
因为百度地图依赖的静态库中采用Objective-C++实现,所有
工程中至少有一个.mm后缀的源文件(可以将任意一个.m后缀的文件改名为.mm,最好不要选AppDelegate.m因为整个项目都有用到它,我是改了ViewController.m文件后缀为.mm)
四、遇到的问题及注意事项
1.Undefined symbols for architecture x86_64错误
单独项目移除BaiduMapAPI_Map.framework,编译成功,导入后编译报错。
因为XCode默认使用的C++标准库是苹果自己的libc++(LLVM C++ standard library with c++11 support),而百度地图SDK中使用的C++标准库是GNU C++的。
解决方法,在target的build settings中搜索“c++ standard library”,将其设置为“libstdc++(GNU C++ standard library)”
2.地图所需资源文件不完整,请根据开发指南正确添加mapapi.bundle文件
以下引用官方文档:
确认项目中添加mapapi.bundle文件以及添加方法正确,不能删除或随意更改其中files文件夹下的内容:注:mapapi.bundle中存储了定位、默认大头针标注View及路线关键点的资源图片,还存储了矢量地图绘制必需的资源文件。如果您不需要使用内置的图片显示功能,则可以删除bundle文件中的image文件夹。您也可以根据具体需求任意替换或删除该bundle中image文件夹的图片文件。添加方式:将mapapi.bundle拷贝到您的工程目录,直接将该bundle文件托拽至Xcode工程左侧的Groups&Files中即可。若您需要替换定位、指南针的图标,请保留原文件名称,否则不显示替换的新图片,默认大头针标注与路线关键点的新图片名称可自定义名称。
坑,自v2.9.0 起,采用分包的形式提供 .framework 包,一共7个包,目录下都没有mapapi.bundle文件,最后还是在Demo工程中拖过来的。
3.授权错误200
app不存在,appkey错误。
解决方案:确保info.plist中的Bundle display name的值和百度后台创建的应用名称一致。Bundle identifier和创建应用的安全码一致。百度提供的appkey和项目AppDelegate代码中的appkey保持一致。
网友评论