iOS项目集成百度地图2016.5

一、开发环境

xcode7+ios9

二、准备工作

1.下载百度地图SDK。直接点:相关SDK下载 ,地址失效的话,百度搜索百度地图api,进入百度开发平台,进行下载。目前最新版本 iOS SDK 2.10.2。
百度官方SDK文档:官方SDK文档 。文档很详细了,不过有些说明是很多年前写的了,不太适用,容易多走一些弯路,本文的出发点也是个人总结,也留个备份,免得以后有需要的时候,自己一些细节又忘了。
2.申请密钥appKey.
百度开发平台,进去点击申请密钥按钮,接着点击创建应用。

47167D94-38DE-4204-82D1-3AF763503C9E.png

注意:安全码和你项目的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保持一致。

五、工程截图

6A61A700-1B04-4D38-878A-644510CE9228.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容