美文网首页上海恩美路演
iOS项目集成百度地图2016.5

iOS项目集成百度地图2016.5

作者: cj2527 | 来源:发表于2016-05-27 13:21 被阅读401次

    一、开发环境

    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

    相关文章

      网友评论

        本文标题:iOS项目集成百度地图2016.5

        本文链接:https://www.haomeiwen.com/subject/quxfdttx.html