iOS开发之集成高德地图(一)

在iOS开发中,经常会使用到定位和地图,Apple自带的定位和地图应付一般的场景绰绰有余,但是也缺少一些功能,如POI搜索、不够接地气等。因此作者选择了高德地图,这篇文正主要介绍定位功能的集成。

环境:Xcode7.3.1 + iOS 9.3 + 能访问网络

1、注册开发者,创建应用

首先注册成为开发者,成为开发者以后,登录并进入控制台,然后创建一个iOS应用,注意这一定要填写好你的 Bundle identifier,不知道的后文有说明怎么查询。

  • 进入控制台

获取Key.gif

  • 填写key的信息

填写key的信息.png

  • 生成一个key

申请Key.JPG

2、通过CocoaPods导入需要的SDK
platform :ios, '9.0' #手机系统版本
target '集成高德地图' do #新建的Xcode工程名
     pod 'AMapLocation'  #定位 SDK
end
3、配置Info.plist,添加前后台定位的授权信息,到时候会弹出一个对话框让用户选择是否同意(iOS8以后必须要添加),可以先只设置NSLocationWhenInUseUsageDescription
NSLocationWhenInUseUsageDescription  表示应用在前台的时候可以搜到更新的位置信息。
NSLocationAlwaysUsageDescription  表示应用在前台和后台(suspend 或 terminated)都可以获取到更新的位置数据。
4、在AppDelegate中初始化key
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//    不知道Bundle identifier的通过如下方式查询
//    NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];  
//    NSLog(@"%@", bundleIdentifier);
    
    [AMapServices sharedServices].apiKey =@"注册产生的key";
    
    
    return YES;
}
5、UIViewController代码,注释非常详细

通过官方文档,我们知道一共有三种定位方式,分别是一次定位、持续定位和后台定位,分别用三个独立的方法分开写了。

#import "ViewController.h"
#import <AMapFoundationKit/AMapFoundationKit.h>

#import <AMapLocationKit/AMapLocationKit.h>

@interface ViewController ()<AMapLocationManagerDelegate>

//定位管理器
@property(nonatomic, strong) AMapLocationManager *locationManager;
//定位回调次数统计
@property(nonatomic, assign) NSInteger count;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.count = 0;
    
    [self onceLoaction];
    [self alwaysLoaction];
    [self backgroundLoaction];
    
    
}

#pragma mark - 持续定位
-(void)backgroundLoaction{
    
    //初始化定位管理器
    self.locationManager = [[AMapLocationManager alloc]init];
    // 设置代理对象
    self.locationManager.delegate = self;
    // 设置反地理编码
    self.locationManager.locatingWithReGeocode = YES;
    //iOS9设置后台定位
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
        self.locationManager.allowsBackgroundLocationUpdates = YES;
    }
    //开启持续定位
    [self.locationManager startUpdatingLocation];
    
}


#pragma mark - 持续定位
-(void)alwaysLoaction{
    
    //初始化定位管理器
    self.locationManager = [[AMapLocationManager alloc]init];
    // 设置代理对象
    self.locationManager.delegate = self;
    // 设置反地理编码
    self.locationManager.locatingWithReGeocode = YES;
    //开启持续定位
    [self.locationManager startUpdatingLocation];
    
}


#pragma mark - 单次定位
-(void)onceLoaction{
    
    //初始化定位管理器
    self.locationManager = [[AMapLocationManager alloc]init];
    //单次定位
    [self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
        
        NSLog(@"%@", regeocode);
        
    }];
}


#pragma mark - 2个代理方法
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location{
    
    NSLog(@"我是个倒霉蛋,我不会被调用");
    
}

//若实现了下面的回调,将不会再回调amapLocationManager:didUpdateLocation:方法。
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode{
    
    if (reGeocode)
    {
        NSLog(@"reGeocode:%@", reGeocode);
    }
    
    self.count++;
    
    if (self.count == 10) {
        // 超过10次停止定位
        [self.locationManager stopUpdatingLocation];
    }
    
}

@end
总结

三种不同的定位,都可以实现定位,开发时请根据不同的需求选择不同的定位方式:

  • 单次定位:使用简单,只需要一个方法就可以搞定,无需设置代理
  • 持续定位:需要设置代理,通过startUpdatingLocation方法获取定位信息,代理回调函数会被调用多次
  • 后台定位:除了持续定位需要做的以外,还需要设置NSLocationAlwaysUsageDescription字段,否则退出后台会有大蓝条提示,而且iOS9之前和之后的做法也不同。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏慎独

Unity5.6与Xcode8.3原生工程整合交互

1591
来自专栏王大锤

最新版SDWebImage的使用

1253
来自专栏自动化测试实战

《selenium2 python 自动化测试实战》(13)——上传文件

3876
来自专栏向治洪

React Native之打包

用React Native开发好APP之后,如何将APP发布到市场以供用户使用呢?不管是Android还是ios等原生app走的都是:签名打包—>发布到各sto...

3316
来自专栏DeveWork

WordPress 免插件仅代码实现 Gravatar 头像缓存

如果你还不知道是神马东东,请先往《设置你的Gravatar头像的方法》一文了解相关资料。因为我大中华局域网的原因, Gravatar 头像所托管的网站有时候会挂...

21510
来自专栏iOS122-移动混合开发研究院

iRate快速绕坑使用

目的 iRate库通过激励用户去AppStore打分,来帮助你提升iPhone和Mac App的质量。这是取得经常使用的目标用户的意见的最好的方式之一。 方案(...

2176
来自专栏進无尽的文章

代码管理| 手把手教你封装自己的静态库SDK

这里重点说下,怎样饮用Bundle中的图片资源。这里使用的是简写:@"JWJFramework.bundle/open"其中JWJFramework.bundl...

3091
来自专栏前端人人

React多页面应用4(webpack自动化生成多入口页面)

本教程总共7篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1.React多页面应用1(webpack开发环境搭建,包...

6025
来自专栏熊二哥

IntellijIDEA快速入门(Windows版)

跟随公司变更技术堆栈的步伐,开始学习相应工具IntelliJ的使用,之前一个大神同时也提到,最近该IDE的市场份额已然超越了免费的Eclipse,因此该工具已经...

1937
来自专栏前端开发

前端安全问题之-点击劫持

2585

扫码关注云+社区

领取腾讯云代金券