陈斌彬的技术博客

Stay foolish,stay hungry

iOS - 百度地图定位(原创)

申请密钥

百度地图 iOS SDK 开发密钥的申请地址为:http://lbsyun.baidu.com/apiconsole/key

申请步骤如下:

第一步:打开 API 控制台,点击创建应用,开始申请开发密钥,如下图:

img

第二步:填写应用名称、应用类型注意选择“iOS SDK”、正确填写安全码,点击确认,系统将会自动帮您生成相应的开发密钥:

img

第三步:控制台列表中的“访问应用(ak)”就是您在开发过程中需要用到的开发密钥,请妥善保管。

安全码简介

在申请开发密钥的时候,需要填写对应工程的安全码。这里的安全码指的是该应用的 Bundle Identifier,获取方式如下: Xcode 切换到 General 标签查看 Bundle Identifier

img

配置开发环境

配置.framework形式开发包

第一步:引入 BaiduMapAPI.framework

百度地图 SDK 提供了模拟器和真机两种环境所使用的 framework ,分别存放在 libs/Release-iphonesimulatorlibs/Release-iphoneos 文件夹下,开发者可根据需要使用真机或模拟器的包。到相关下载这里下载。

img

解压后可以看到有三个文件夹。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 。 img

将所需的 BaiduMapAPI.framework 拷贝到工程所在文件夹下。

TARGETS->Build Phases-> Link Binary With Libaries 中点击 + 按钮,在弹出的窗口中点击 Add Other 按钮,选择 BaiduMapAPI.framework 文件添加到工程中。

img

img

img

第二步:引入所需的系统库

百度地图 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 即可。 如图所示:

img

第三步:环境配置

TARGETS->Build Settings->Other Linker Flags 中添加 -ObjC。按 Enter 确定。

img

第四步:引入mapapi.bundle资源文件

如果使用了基础地图功能,需要添加该资源,否则地图不能正常显示 mapapi.bundle 中存储了定位、默认大头针标注 View 及路线关键点的资源图片,还存储了矢量地图绘制必需的资源文件。如果您不需要使用内置的图片显示功能,则可以删除 bundle 文件中的 image 文件夹。您也可以根据具体需求任意替换或删除该 bundleimage 文件夹的图片文件。

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

img

img

第五步:引入头文件

在使用 SDK 的类引入头文件:

#import <BaiduMapAPI/BMapKit.h>//引入所有的头文件

#import <BaiduMapAPI/BMKMapView.h>//只引入所需的单个头文件

第六步:添加 Bundle Display name

img

img

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

img

在您的 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;
}

img

创建 BMKMapView

在您的 ViewController.h 文件中添加 BMKMapViewDelegate

img

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

- (void)viewDidLoad {  
    [super viewDidLoad];  
    mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)]; 
    self.view = mapView;      
}

img

自2.0.0起,BMKMapView 新增 viewWillAppearviewWillDisappear 方法来控制 BMKMapView 的生命周期,并且在一个时刻只能有一个 BMKMapView 接受回调消息,因此在使用 BMKMapViewviewController 中需要在 viewWillAppearviewWillDisappear 方法中调用 BMKMapView 的对应的方法,并处理 delegate,代码如下:

-(void)viewWillAppear:(BOOL)animated
{
    [mapView viewWillAppear];
    mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
}
-(void)viewWillDisappear:(BOOL)animated
{
    [mapView viewWillDisappear];
    mapView.delegate = nil; // 不用时,置nil
}

img

编译,运行,效果如下图所示:

img

定位功能

简介

由于系统原因,iOS 不允许使用第三方定位,因此地图 SDK 中的定位方法,本质上是对原生定位的二次封装。通过封装,开发者可更便捷的使用。此外,地图 SDK 中还提供了相应的定位图层(支持定位三态效果),帮助开发者显示当前位置信息。

注:自 iOS8 起,系统定位功能进行了升级,SDK 为了实现最新的适配,自 v2.5.0 起也做了相应的修改,开发者在使用定位功能之前,需要在 info.plist 里添加(以下二选一,两个都添加默认使用 NSLocationWhenInUseUsageDescription ):

  • NSLocationWhenInUseUsageDescription ,允许在前台使用时获取 GPS 的描述
  • NSLocationAlwaysUsageDescription ,允许永久使用 GPS 的描述

img

获取位置信息

定位功能可以和地图功能分离使用,单独的定位功能使用方式如下:

- (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);
}

img

中心点更换

在模拟器中,中心点位置默认是北京。在此处可以根据具体的城市改变经纬度。

模拟器不可以实时定位,只能设定一个死位置。

img

如改成揭阳:

img

更新MapStatus

由于demo的默认中心点是北京,所以实际使用时需要更换中心点,添加红色方框中的两个语句

img

效果如下:

img

Resource Reference