陈斌彬的技术博客

Stay foolish,stay hungry

iOS - 高德地图

申请 Key

获取用户Key

1.访问 http://lbs.amap.com/console/key/,使用高德开发者账号登陆

2.在“KEY管理”页面点击上方的“获取key”按钮,依次输入应用名,选择绑定的服务为“iOS平台SDK”,输入 Bundle Identifier(获取方法请参考:获取 Bundle Indentifier),如下图所示:

img

获取 Bundle Indentifier

iOS bundle 获取方式

方法一

通过代码获取,代码如下所示:

NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];

方法二

Xcode 切换到 General 标签,查看 Bundle Identifier,如下图所示:

img

地图显示

地图显示是地图 SDK 的基础功能,相当于学习编程语言中的 HelloWorld,一切从这里开始。

首先,在“相关下载”页面中根据您的需求下载库文件并解压,包括:

  • 3D 矢量地图库,解压后得到 MAMapKit.framework 文件。3D 矢量地图效果优,可查看 3D 楼块,功能全,还支持离线地图,能帮您节省流量。目前暂不支持地图多实例。
  • 2D 栅格地图库,解压后得到 MAMapKit.framework 文件。2D 栅格地图库体积小,能耗低。支持地图多实例。
  • 搜索库,解压后得到 AMapSearchKit.framework 文件。搜索库功能包含:POI 查询、路径规划、地理编码和逆地理编码、公交查询以及输入提示语查询。

注意:3D矢量地图和2D栅格地图只能选择一个使用,接口类似。

新建工程

新建一个 Single View Application工程,如下图所示:

img

配置工程

引入地图库

左侧目录中选中工程名,在 TARGETS->Build Phases-> Link Binary With Libaries 中点击 “+” 按钮,在弹出的窗口中点击 “Add Other” 按钮,选择解压后的 MAMapKit.framework 文件添加到工程中。

img

引入AMap.bundle资源文件

AMap.bundle 资源文件中存储了定位、默认大头针标注视图等图片,可利用这些资源图片进行开发。

左侧目录中选中工程名,在右键菜单中选择 Add Files to “工程名”…,从MAMapKit.framework->Resources 文件中选择 AMap.bundle 文件,并勾选 “Copy items if needed” 复选框,单击 “Add” 按钮,将资源文件添加到工程中。

img

img

引入系统库

需引入的系统库如下表所示:

img 说明:

1.备注中,2D表示使用2D栅格地图需要的系统文件,3D表示使用3D矢量地图需要的系统文件、Search表示使用搜索库需要的系统文件。

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

3.iOS9后,需要把libz.dylib、libstdc++6.09.dylib、libc++.dylib替换成libz.tbd、libstdc++.tbd、libc++.tbd。

引入系统库的操作如下:

左侧目录中选中工程名,在 TARGETS->Build Settings-> Link Binary With Libaries 中点击 “+” 按钮,在弹出的窗口中查找并选择所需的库(见下表),单击 “Add” 按钮,将库文件添加到工程中。

img

环境配置

TARGETS->Build Settings->Other Linker Flags 中添加 -ObjC

img

注意:

V2.3.0(含)之前版本不支持arm64,需在 TARGETS->Build Settings->Architectures 点出选择框,选择 “Other”,将默认值修改为 $(ARCHS_STANDARD_32_BIT)。

img

配置用户Key

在使用地图 SDK 时,需要对应用做 Key 机制验证,在地图初始化之前添加如下示例代码,配置之前在官网上申请的 Key:

[MAMapServices sharedServices].apiKey = @"用户Key";

显示地图

(1)修改 ViewController.m 文件,引入 MAMapKit.h 文件,继承 MAMapViewDelegate 协议,并定义 MAMapView 对象,示例代码如下所示:

#import <ViewController.h>
#import <MAMapKit/MAMapKit.h>

@interface ViewController ()<MAMapViewDelegate>
{
    MAMapView *_mapView;
}
@end

(2)在 ViewController.m 文件相应的方法中进行地图初始化,初始化的步骤:

1.构造 MAMapView 对象;

2.设置代理;

3.将 MAMapView 添加到 Subview 中。

对于 2D 矢量地图,在 viewDidLoad 方法中添加代码:

-(void) viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //配置用户Key
    [MAMapServices sharedServices].apiKey = @"用户Key";

    _mapView = [[MAMapView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds))];
    _mapView.delegate = self;

    [self.view addSubview:_mapView];
}

程序截图:

img

开启定位

只要开启定位开关(MAMapView 的 showsUserLocation 属性)就可以开始定位。代码如下所示:

- (void)viewDidLoad 
{

    [super viewDidLoad];
    _mapView.showsUserLocation = YES; //YES 为打开定位,NO 为关闭定位

}

当位置更新时,会进定位回调,通过回调函数,能获取到定位点的经纬度坐标,示例代码如下:

-(void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation    updatingLocation:(BOOL)updatingLocation {              //取出当前位置的坐标       NSLog(@"latitude : %f,longitude: %f",userLocation.coordinate.latitude,userLocation.coordinate.longitude);     
}

img