在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之前和之后的做法也不同。