申请密钥
百度地图 iOS SDK 开发密钥的申请地址为:http://lbsyun.baidu.com/apiconsole/key
申请步骤如下:
第一步:打开 API 控制台,点击创建应用,开始申请开发密钥,如下图:
第二步:填写应用名称、应用类型注意选择“iOS SDK”、正确填写安全码,点击确认,系统将会自动帮您生成相应的开发密钥:
第三步:控制台列表中的“访问应用(ak)”就是您在开发过程中需要用到的开发密钥,请妥善保管。
安全码简介
在申请开发密钥的时候,需要填写对应工程的安全码。这里的安全码指的是该应用的 Bundle Identifier
,获取方式如下: Xcode 切换到 General
标签查看 Bundle Identifier
配置开发环境
配置.framework形式开发包
第一步:引入 BaiduMapAPI.framework
百度地图 SDK 提供了模拟器和真机两种环境所使用的 framework
,分别存放在 libs/Release-iphonesimulator
和 libs/Release-iphoneos
文件夹下,开发者可根据需要使用真机或模拟器的包。到相关下载这里下载。
解压后可以看到有三个文件夹。BaiduMap_IOSSDK_v2.8.0_Docs,BaiduMap_IOSSDK_v2.8.0_Lib,BaiduMap_IOSSDK_v2.8.0_Sample。 其中 BaiduMap_IOSSDK_v2.8.0_Lib 包含模拟机和真机的 framework 。
将所需的 BaiduMapAPI.framework
拷贝到工程所在文件夹下。
在 TARGETS->Build Phases-> Link Binary With Libaries
中点击 +
按钮,在弹出的窗口中点击 Add Other
按钮,选择 BaiduMapAPI.framework
文件添加到工程中。
第二步:引入所需的系统库
百度地图 SDK 中提供了定位功能和动画效果,v2.0.0 版本开始使用 OpenGL
渲染,因此您需要在您的 Xcode 工程中引入
- CoreLocation.framework
- QuartzCore.framework
- OpenGLES.framework
- SystemConfiguration.framework
- CoreGraphics.framework
- Security.framework
添加方式:在 Xcode 的 Project -> Active Target ->Build Phases ->Link Binary With Libraries
,添加这几个 framework 即可。
如图所示:
第三步:环境配置
在 TARGETS->Build Settings->Other Linker Flags
中添加 -ObjC
。按 Enter
确定。
第四步:引入mapapi.bundle资源文件
如果使用了基础地图功能,需要添加该资源,否则地图不能正常显示
mapapi.bundle
中存储了定位、默认大头针标注 View
及路线关键点的资源图片,还存储了矢量地图绘制必需的资源文件。如果您不需要使用内置的图片显示功能,则可以删除 bundle
文件中的 image
文件夹。您也可以根据具体需求任意替换或删除该 bundle
中 image
文件夹的图片文件。
方法:选中工程名,在右键菜单中选择 Add Files to “工程名”…
,从 BaiduMapAPI.framework||Resources
文件中选择 mapapi.bundle
文件,并勾选 Copy items if needed
复选框,单击 Add
按钮,将资源文件添加到工程中。
第五步:引入头文件
在使用 SDK 的类引入头文件:
#import <BaiduMapAPI/BMapKit.h>//引入所有的头文件
#import <BaiduMapAPI/BMKMapView.h>//只引入所需的单个头文件
第六步:添加 Bundle Display name
Hello BaiduMap
初始化 BMKMapManager
在您的 AppDelegate.h
文件中添加 BMKMapManager
的定义
#import <UIKit/UIKit.h>
#import <BaiduMapAPI/BMapKit.h>//引入所有的头文件
@interface AppDelegate : UIResponder <UIApplicationDelegate,BMKGeneralDelegate>
{
UINavigationController *navigationController;
BMKMapManager* _mapManager;
}
@property (strong, nonatomic) UIWindow *window;
@end
在您的 AppDelegate.m
文件中添加对 BMKMapManager
的初始化,并填入您申请的授权 Key
,示例如下
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 要使用百度地图,请先启动BaiduMapManager
_mapManager = [[BMKMapManager alloc]init];
// 如果要关注网络及授权验证事件,请设定 generalDelegate参数
BOOL ret = [_mapManager start:@"DSEGs6DvbZIB7PX8eWsDo3zO" 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;
}
创建 BMKMapView
在您的 ViewController.h
文件中添加 BMKMapViewDelegate
在您的 ViewController.m
文件中添加 BMKMapView
的创建代码,示例如下
- (void)viewDidLoad {
[super viewDidLoad];
mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
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
}
编译,运行,效果如下图所示:
定位功能
简介
由于系统原因,iOS 不允许使用第三方定位,因此地图 SDK 中的定位方法,本质上是对原生定位的二次封装。通过封装,开发者可更便捷的使用。此外,地图 SDK 中还提供了相应的定位图层(支持定位三态效果),帮助开发者显示当前位置信息。
注:自 iOS8 起,系统定位功能进行了升级,SDK 为了实现最新的适配,自 v2.5.0 起也做了相应的修改,开发者在使用定位功能之前,需要在 info.plist
里添加(以下二选一,两个都添加默认使用 NSLocationWhenInUseUsageDescription
):
- NSLocationWhenInUseUsageDescription ,允许在前台使用时获取 GPS 的描述
- NSLocationAlwaysUsageDescription ,允许永久使用 GPS 的描述
获取位置信息
定位功能可以和地图功能分离使用,单独的定位功能使用方式如下:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
self.view = mapView;
//初始化BMKLocationService
_locService = [[BMKLocationService alloc]init];
_locService.delegate = self;
//启动LocationService
[_locService startUserLocationService];
}
//实现相关delegate 处理位置信息更新
//处理方向变更信息
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
{
NSLog(@"heading is %@",userLocation.heading);
}
//处理位置坐标更新
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
}
中心点更换
在模拟器中,中心点位置默认是北京。在此处可以根据具体的城市改变经纬度。
模拟器不可以实时定位,只能设定一个死位置。
如改成揭阳: