iOS项目集成百度地图2016.5

一、开发环境

xcode7+ios9

二、准备工作

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

iOS项目集成百度地图2016.5_第1张图片
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的使用。

NSAppTransportSecurity 
   NSAllowsArbitraryLoads 
   
  

2.适配iOS8.0以上的定位,需要在info.plist里添加

NSLocationAlwaysUsageDescription
    
    NSLocationWhenInUseUsageDescription
    

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个。


iOS项目集成百度地图2016.5_第2张图片
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 
@interface AppDelegate : UIResponder 
{
    UINavigationController *navigationController;
    BMKMapManager* _mapManager;
}

6.AppDelegate.m文件代码

#import 
- (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保持一致。

五、工程截图

iOS项目集成百度地图2016.5_第3张图片
6A61A700-1B04-4D38-878A-644510CE9228.png

你可能感兴趣的:(iOS项目集成百度地图2016.5)