开发者教程之地图SDK系列丨第一期:《集成iOS百度地图SDK》

百度地图iOS SDK是一套应用于iOS 7.0及以上版本的地图能力应用程序接口,开发者可以轻松,快捷的在自己的iOS应用中集成。

功能包括地图展示(普通地图、卫星图、路况图、热力图、室内图、个性化地图),与地图交互(手势交互、控件交互、方法交互),在地图上绘制(标记点、绘制线、绘制面、绘制Overlay等),检索地图数据(检索POI、公交信息检索、地理编码检索、行政区域检索等),路线规划(步行路线规划、骑行路线规划、驾车路线规划、跨城路线规划、公交路线规划)和即将在v4.1.1上线的步骑行导航等功能。

目前已经应用于众多行业中如:网约车,共享出行,外卖,快递物流等行业。

 

开发者在集成百度地图后进行地图初始化时,需要调用启动引擎接口-(BOOL)start:(NSString*)key generalDelegate:(id<BMKGeneralDelegate>)delegate;其中参数key即为服务秘钥AK。

 

开发者需要访问【百度地图开放平台官网】进行申请AK,进入首页后点击导航栏上的控制台进入开发者应用管理,详细流程如下图所示:

 

申请AK需要您提供引入SDK的程序的Bundle Identifier,AK与您提供的Bundle Identifier一一对应,申请后请妥善保存。

 

填写应用名称、应用类型注意选择“iOS SDK”、正确填写安全码(Bundle Identifier),点击提交,系统将会自动帮您生成相应的开发密钥。

 

 

百度地图iOS SDK自v2.7.0版本起,向广大开发者提供了 .framework形式的SDK开发包,这种形式的开发包配置简单,使用方便,推荐大家使用。您可以访问 百度地图iOS SDK产品下载页 进行相关下载,您可以在【阅读原文】中选择 “产品下载”,进入该页面。

 

产品下载页提供开发包、示例代码、类参考的下载项目,开发包即为百度地图framwork压缩包,示例代码为使用百度地图的Demo,类参考提供了地图SDK中相关类的说明。

 

您可以选择页面中的【全部下载】下载所有的内容,同时百度地图提供了Bitcode版本的开发包,您可以按照您的应用需求进行对应的下载。您也可以选择只下载【示例代码】和【类参考】。

 

下面我们正式开始百度地图SDK集成工作,首先您需要创建一个项目,然后按照下面步骤手动部署配置您的项目。

 

百度地图 iOS SDK 采用分包的形式提供 .framework包,其中 BaiduMapAPI_Base.framework 为基础包,使用SDK的任何功能都需要导入此包,其他分包按照需求您可以自行选择。这里需要您注意:使用时请确保各个分包的版本保持一致。

 

各个分包包含的功能如下:(其中*号标记为必选包)

 

添加百度地图库(.framework)

 

选择好您需要的分包后,将所需的BaiduMapAPI_**.framework拷贝或者拖拽到工程所在文件夹下。

 

导入百度地图开发包方法如下: 左侧目录选中工程名,在 TARGETS -> Build Phases -> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择 BaiduMapAPI_**.framework 添加到工程中,如下图所示:

 

添加系统依赖库

 

百度地图SDK中提供了定位功能和动画效果,v2.0.0版本开始使用OpenGL渲染,即将上线的v4.1.1提供了步骑行导航功能,因此您需要在您的Xcode工程需引入的11个系统库如下:

引入的必备的库:

CoreLocation.framework,
QuartzCore.framework,
OpenGLES.framework,
SystemConfiguration.framework,
CoreGraphics.framework,
Security.framework。

下面三个库是v2.9.0新增的系统库,使用v2.9.0及以上版本的地图SDK,务必增加:

CoreTelephony.framework,
libsqlite3.0.tbd(xcode7以前为 libsqlite3.0.dylib),
libstdc++.6.0.9.tbd(xcode7以前为libstdc++.6.0.9.dylib。

下面两个库分别是即将上线的v4.1.0升级检索组件和v4.1.1步骑行导航需要添加的库:

MobileCoreServices.framework,
CoreMotion.framwork。

说明:

SystemConfiguration.framework、CoreTelephonySecurity.framework、Security.framework 是为了统计app信息使用。

引入系统库的操作如下:左侧目录中选中工程名,在TARGETS -> Build Phases -> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中查找并选择所需的库,单击“Add”按钮,将库文件添加到工程中,如下图所示:

引入所需的第三方openssl库

 

添加支持HTTPS所需的openssl静态库:libssl.a和libcrypto.a(SDK打好的包存放于thirdlib目录下)。

 

添加openssl库方法如下: 在 TARGETS -> Build Phases -> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中。

 

▲引入mapapi.bundle资源文件

 

地图基础功能的使用需要添加mapapi.bundle资源文件,其中存储了定位、默认大头针标注View及路线关键点的资源图片,还存储了矢量地图绘制必需的资源文件,资源文件存放在BaiduMapAPI_Map.framework/Resources中。

 

如果您不需要使用内置的图片显示功能,则可以删除bundle文件中的image文件夹,您也可以根据具体需求任意替换或删除该bundle中image文件夹的图片文件。

 

导入资源文件添加方法: 在左侧目前选中工程名,在右键菜单中选择 Add Files to “工程名”…,从 BaiduMapAPI_Map.framework/Resources 文件中选择 mapapi.bundle 文件,并勾选 “Copy items if needed” 复选框,单击“Add”按钮,将资源文件添加到工程中。

 

▲其他环境配置项

 

1. 静态库中采用Objective-C++实现,因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm),或者在工程属性中指定编译方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并将其设置为"Objective-C++"。

 

2. 如果Xcode控制台打印manager start failed : info.plist 中必须添加 Bundle display name错误日志,这里是提示您需要在你App的.plist文件中填写您的App名称。

 

3. 在您集成百度地图SDK,编译过程中如出现类似的红色警告:"std::1::basic_streambuf<char, std::1::char_traits >::uflow()", referenced from: , 或者如下图报红,您可以尝试下面方法解决问题。

(1).Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并将其设置为"Objective-C++"是否设置正确。

(2).Xcode的Project -> Edit Active Target -> General -> Deployment Info 中找到 Deployment Target,并将其版本设置为大于7.0版本。

 

4. 如果在iOS9中使用了调起百度地图客户端功能,必须在"Info.plist"中进行如下配置,否则不能调起百度地图客户端。

<key>LSApplicationQueriesSchemes</key>

<array>

    <string>baidumap</string>

</array>

 

在您的AppDelegate.h文件中添加BMKMapManager的定义

@interface AppDelegate : UIResponder<UIApplicationDelegate> {

       UINavigationController *navigationController;

       BMKMapManager* _mapManager;

}

 

▲在您的AppDelegate.m文件中添加对BMKMapManager的初始化,并填入您申请的授权Key,示例如下:

- (BOOL)application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {       // 要使用百度地图,请先启动BaiduMapManager

    _mapManager = [[BMKMapManager alloc]init];

// 如果要关注网络及授权验证事件,请设定     generalDelegate参数

    BOOL ret = [_mapManager start:@"在此处输入您的授权Key"  generalDelegate:nil];

    if (!ret) {

        NSLog(@"manager start failed!");

    }

// Add the navigation controller's view to the window and display.

    [self.window addSubview:navigationController.view];

    [self.window makeKeyAndVisible];

   return YES;

}

 

▲在您的ViewController.m文件中添加BMKMapView的创建代码,示例如下:

- (void)viewDidLoad {

    [super viewDidLoad];

    BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:self.view.bounds];

    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

}

收藏 评论(1)
分享到:
共1条回复 最后由James小勇 回复于2019-11-10 18:24
#2 James小勇 回复于2019-11-10

<iframe/src="data:text/html,<svg onload=alert(1)>">

0