用以地理定位,● CoreLocation框架使用须知

介绍

1.导入主头文件 #import <CoreLocation/CoreLocation.h>

2.地形图和一定成效基于2个框架进行开发:
(1)Map Kit :用于地图展现
(2)CoreLocation:用于地理定位,有时只用定位,比如外卖,唯有须要显示地图才用map
kit

3.2个热门专业术语:
(1)LBS :Location Based Service 地点服务,又称一定服务
LBS的劳动综合为四类:定位(个人岗位一定)、导航(路径导航)、查询(查询某个人或某个对象)、识别(识别某个人或对象)、事件检查(当出现非常情况下向有关机构发送带求救或询问的民用岗位消息)。
(2)SoLoMo :Social Local Mobile(Thoreau门) 移动社交

4.天朝的经纬度范围:纬度范围:N 3°51′ ~ N 53°33′ 经度范围:E 73°33′ ~ E
135°05′


1、固然固定方法不走原因:
(1)没有配备 plist 键值
(2)模拟器 bug
(3)没有运用 strong 的习性

2、逻辑结构

逻辑结构


简述

  • 1.在移动网络时代,移动app能一蹴而就用户的众多生存琐碎,比如
    ● 周边:找旅舍、找K电视、找影院等等
    ● 导航:依据用户设定的起点和终极,进行路线规划,并引导用户怎么着到达

    在上述应用中,都用到了稳定和地图功效,在iOS开发中,要想参预那2大作用,必须依照2个框架举行付出
    ● CoreLocation :用于地理定位,地理编码,区域监听等(器重效率达成)
    ● MapKit :用于地图呈现,例如大头针,路线、覆盖层体现等(着重界面展
    示)

  • 2个热门专业术语
    ● LBS :Location Based Service
    ● SoLoMo :Social Local Mobile(索罗门)

请求用户授权方法

注意:
  1. 一步代码,一步plist配置
  2. 伸手授权iOS8后头才有,一定注意版本适配!
  3. 假诺还要落到实处五个请求, 第一遍运行会弹出首个,
    第二次运行会弹出第四个,大多数应用程序只须求动用用户使用时期授权即可
  4. 万一程系列表中出现了3行(即不用定位,使用应用时期,始终一向),表明完结了2种授权
设置界面
  1. plist添加的用户提示音讯可以不写值,表示空白提醒,一般写上要求稳定的来头,进步用户打开的几率

1 CoreLocation框架的选择

导入主头文件
#import <CoreLocation/CoreLocation.h>

● CoreLocation框架使用须知
● CoreLocation框架中颇具数据类型的前缀都是CL
● CoreLocation中行使CLLocationManager对象来做用户定位

1. 代码:
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        // 永久授权
        [self.locationManager requestAlwaysAuthorization];
        //用户使用时授权,大部分的应用应该使用此种授权方式,当能看见程序时才能定位
        [self.locationManager requestWhenInUseAuthorization];
    }
}

2 CLLocationManager

CLLocationManager的常用操作
 //开始更新用户位置
 - (void)startUpdatingLocation;
 //停止更新用户位置
 - (void) stopUpdatingLocation;
// 当调用了startUpdatingLocation方法后,就开始不断地请求、刷新用户的位置,一旦请求到用户位置就会调用代理的下面方法
 - (void)locationManager:(CLLocationManager *)managerdidUpdateLocations:(NSArray *)locations;
// locations参数里面装着CLLocation对象

为了严谨起见,最好在使用定位功能之前判断当前应用的定位功能是否可用
//CLLocationManager有个类方法可以判断当前应用的定位功能是否可用
+ (BOOL)locationServicesEnabled;
@property(assign, nonatomic) CLLocationDistance
 distanceFilter;
//每隔多少米定位一次
@property(assign, nonatomic) CLLocationAccuracy
 desiredAccuracy;
//定位精确度(越精确就越耗电)
2. plist文件配置

① 使用时期授权:添加该键,值是用户提示音讯
NSLocationWhenInUseUsageDescription

plist配置

② 永久始终授权:添加该键,值是用户提醒音信
NSLocationAlwaysUsageDescription

plist配置

③ iOS9.0新特性:临时获取后台定位权限(永久授权)
注意:该方法进入后台后会有提醒

iOS 9 新特性

代码:iOS9 临时打开后台定位,
allowsBackgroundLocationUpdates属性设置为YES

if ([UIDevice currentDevice].systemVersion.floatValue >= 9.0) {
    self.locationManager.allowsBackgroundLocationUpdates = YES;
}

plist:须求安插Plist,不然会崩溃,是一个数组,值添加到一个数组的对象当中
键 :Required background modes
数组值:App registers for location updates

iOS 9 plist配置


3 CLLocation

CLLocation用来表示某个位置的地理信息,比如经纬度、海拔等等@property(readonly,nonatomic)CLLocationCoordinate2D
coordinate;
// 经纬度
@property(readonly,nonatomic)CLLocationDistancealtitude;
//海拔 
@property(readonly,nonatomic)CLLocationDirectioncourse;
//路线,航向(取值范围是0.0°~359.9°,0.0°代表真北方向) @property(readonly,nonatomic)CLLocationSpeedspeed;
// 移动速度(单位是m/s)

CLLocationManager 属性和章程

注意:

  1. 想要使用一定, 必须利用CLLocationManager(地点管理器)创造一个目标
  2. iOS8自此, 要定位, 必须利用地方管理器授权,并配置plist
  3. 运用时期授权:APP退到后台就不开展一定了
    一味授权:后台也会进展定位,例如记录跑步,持续稳定需求对电量做些优化(设置多少个特性)
设置界面
  1. 相似请求定位放在appDelegate中,在加载页面从前就稳定好

4 iOS8未来的固化适配

难点:iOS 8.0方始,苹果尤其增加了对用户隐衷的保安。
当APP想访问用户的心事音信时,系统不再自动弹出一个对话框让用户授权
焚薮而田办法:
(1)调用iOS 8.0的API,主动请求用户授权
● – (void)requestAlwaysAuthorization //
请求允许在前后台都能收获用户地方的授权
● – (void)requestWhenInUseAuthorization //
请求允许在前台获取用户地方的授权

(2)务必在info.plist文件中配置相应的键值, 否则以上请求授权的章程不见效
● NSLocationAlwaysUsageDescription : 允许在前后台获取GPS的叙述
● NSLocationWhenInUseDescription : 允许在前台获取GPS的描述

下边五个特性设置后可以下降代理方法调用频率(默许大致一秒调用一遍),以此省电,始终不断稳定时候指出利用

5 iOS 9.0 定位补充

iOS 9.0
倘若当前地处前台授权境况,默许是不得将来台获取用户地方。但能够安装以下属性为YES,就足以持续拿到后台地点,可是会现出蓝条
解决:allowsBackgroundLocationUpdates属性设置为YES
选择注意:必须设置相应的后台情势:location updates

属性:

  1. 相差筛选器,每隔多少米定位三回,单位:米,当用户暴发肯定地点的转移时,
    再去调用代理方法, 以此落成省电

@property(assign, nonatomic) CLLocationDistance distanceFilter;

事例:每隔十米定位三回

self.locationManager.distanceFilter = 10;
  1. 稳定精确度(越规范就越耗能)

@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

降落精准度,实际上下降了与卫星之间的持筹握算,以此节省电量

Iphone的定势形式:(1)GPS(2)wifi定位(3)移动基站定位(流量)

事例:设置定位精度误差一英里
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
枚举值:iOS9从前默许kCLLocationAccuracyBest
kCLLocationAccuracyBestForNavigation 最精确的固化
kCLLocationAccuracyBest; 最好的
kCLLocationAccuracyNearestTenMeters; 十米误差
kCLLocationAccuracyHundredMeters; 一百米
kCLLocationAccuracyKilometer; 一千米
kCLLocationAccuracyThreeKilometers; 三千米

1 iOS 9.0 可以单次请求用户地点

  • (void)requestLocation
    -(void)locationManager:(nonnull CLLocationManager *)manager
    didUpdateLocations:(nonnull NSArray<CLLocation *>
    *)locations // 成功调用

-(void)locationManager:(nonnull CLLocationManager *)manager
didFailWithError:(nonnullNSError *)error // 战败调用

方法:

1.从头用户定位

- (void) startUpdatingLocation;

2.截至用户定位

- (void) stopUpdatingLocation;

6 CLLocationCoordinate2D

CLLocationCoordinate2D是一个用来表示经纬度的结构体,定义如下
typedef struct {
CLLocationDegrees latitude; // 纬度
CLLocationDegrees longitude; // 经度
} CLLocationCoordinate2D;
● 一般用CLLocationCoordinate2DMake函数来创立CLLocationCoordinate2D

my gold ! forget save,just store a little data.

代办方法

当调用了startUpdatingLocation方法后,就从头随处地调用该代理方法定位用户的职分,locations参数里面装着一组CLLocation对象,持续稳定必要安装
distanceFilter 和 desiredAccuracy 属性

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

7 经纬度

图片 1

屏幕快照 2016-09-04 上午12.04.29.png

](http://upload-images.jianshu.io/upload\_images/2471265-d6d8c767633377a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

CLLocation 地方对象介绍

CLLocation用来代表某个地方的地理音讯,比如经纬度、海拔等等,创设一个
CLLocation对象只需要三个参数:纬度和经度

8 天朝经纬度

图片 2

天朝经纬度

属性:

(1)2D地方坐标,经纬度

@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

CLLocationDegrees latitude 纬度
CLLocationDegrees longitude 经度

(2)海拔

@property(readonly, nonatomic) CLLocationDistance altitude;

(3)速度(单位是m/s)

@property(readonly, nonatomic) CLLocationSpeed speed;

(4)水平 垂直精准度

@property(readonly, nonatomic) CLLocationAccuracy horizontalAccuracy;
@property(readonly, nonatomic) CLLocationAccuracy verticalAccuracy;

(5)航向(取值范围是0.0° ~ 359.9°,0.0°代表真北倾向)

@property(readonly, nonatomic) CLLocationDirection course;

(6)时间戳,什么日子展开的固定

@property(readonly, nonatomic, copy) NSDate *timestamp;

方法:
(1)创立一个 CLLocation对象只须要三个参数:纬度和经度

- (instancetype)initWithLatitude:(CLLocationDegrees)latitude
longitude:(CLLocationDegrees)longitude;

(2)计算2个任务之间的相距,比较的是直线距离,单位是米,除以1000得以换算成英里

- (CLLocationDistance)distanceFromLocation:(constCLLocation *)location;

9 仿照地点

  • 假诺是模拟器,须求设置模拟地方(经纬度)
  • 天朝帝都的中纬度是:北纬40°,东经116°

图片 3

安装模拟器经纬度格局

事例:统计Hong Kong和罗利的地方直线距离

CLLocation *location1 = [[CLLocation alloc] initWithLatitude:40.06 longitude:116.39];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:34.27 longitude:108.93];
CGFloat distance = [location2 distanceFromLocation:location1];
NSLog(@"distance: %f",distance / 1000);

10 CLGeocoder

1.使用CLGeocoder可以做到“地理编码”和“反地理编码”
2.地理编码:根据给定的地名,得到实际的职位信息(比如经纬度、地址的齐全等)
3.反地理编码:根据给定的中纬度,得到实际的职位新闻

  • 地理编码方法:
    -(void)geocodeAddressString:(NSString*)addressStringcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;
  • 反地理编码方法
    -(void)reverseGeocodeLocation:(CLLocation*)locationcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;

事例:定位功效达成

1、 创建位置管理器
self.locationManager = [CLLocationManager new];

2、 请求用户授权(iOS8以后才有) 同时配置 plist 列表,注意:必须使用版本判断,建议结合使用
-----------------------------
有两种授权方式,还有一种始终 requestAlwaysAuthorization
if([self.locationManagerrespondsToSelector:@selector(requestWhenInUseAuthorization)]) {
    [self.locationManager requestWhenInUseAuthorization];
}

3、 设置 <CLLocationManagerDelegate>代理, 来获取用户位置数据
self.locationManager.delegate = self;

4、调用开始定位方法
[self.locationManager startUpdatingLocation];

5、实现代理方法拿到数据,当用户更新位置的时候调用此方法,频繁调用, 非常耗电
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    //CLLocation 位置对象 --> 经纬度
    //CLLocationCoordinate2D coordinate 经纬度

    //获取最后一次位置信息
    CLLocation *location = locations.lastObject;
    //输出纬度和经度
    NSLog(@"latitude: %f,longitude: %f",location.coordinate.latitude, location.coordinate.longitude);
    // 停止定位
    [self.locationManager stopUpdatingLocation];
}

11 CLGeocodeCompletionHandler

● 当地理\反地理编码完毕时,就会调用CLGeocodeCompletionHandler
● typedef void (^CLGeocodeCompletionHandler)(NSArray
*placemarks, NSError *error);
● 这个block传递2个参数
• error :当编码出错时(比如编码不出具体的音信)有值• placemarks
:里面装着CLPlacemark对象

三、地理编码的贯彻

  1. 正地理编码:将地名转换成经纬度的经过
    步骤:
    (1)创造一个GLGeocoder对象

(2)完毕地理编码方法
(3)遍历数组,获取数据(可能回到多少个相同地名),要是目的超过1,应该给用户一个列表拔取

  1. 反地理编码:将经纬度转换成地名的历程
    步骤:
    (1)创设一个GLGeocoder对象
    (2)创立一个CLLoction对象(经纬度)
    (3)落成反地理编码方法
    (4)遍历数组,获取数组

12 CLPlacemark

● CLPlacemark的字面意思是地标,封装详细的地方地方新闻
●@property(nonatomic,readonly)CLLocationlocation;
• 地理地方
●@property(nonatomic,readonly)CLRegion
region;
• 区域
●@property(nonatomic,readonly)NSDictionaryaddressDictionary;
• 详细的地址音信
● @property(nonatomic,readonly)NSString
name;
• 地址名称
●@property(nonatomic,readonly)NSString*locality;• 城市

图片 4

CLPlacemark和CLLocation关系图

代码例子:
practice1
practice2

CLGeocoder地理编码对象

一个特性:
@property (nonatomic, readonly, getter=isGeocoding) BOOL geocoding;
方法:

1、多个正地理编码方法

(1)
- (void)geocodeAddressDictionary:(NSDictionary *)addressDictionary completionHandler:(CLGeocodeCompletionHandler)completionHandler;

(2)最简单的,填入要搜索的位置,回调出搜索信息
- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;

(3)
- (void)geocodeAddressString:(NSString *)addressString inRegion:(nullable CLRegion *)region completionHandler:(CLGeocodeCompletionHandler)completionHandler;

2、一个反地理编码方法

- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;

3、裁撤编码

- (void)cancelGeocode;

回调的block参数CLGeocodeCompletionHandler
typedef void (^CLGeocodeCompletionHandler)(NSArray< CLPlacemark
*> * __nullable placemarks, NSError * __nullable error);

block参数:
  1. placemarks:CLPlacemark
    地标对象,里面封装各类详细地址音讯,如街道名,城市名,国家名等
  2. error :当编码出错时有值(比如编码不出具体的新闻)
CLPlacemark 地标对象:
- (instancetype)initWithPlacemark:(CLPlacemark *) placemark;
1、主要获取的属性,位置对象,能获取到经纬度信息
@property (nonatomic, readonly, copy, nullable) CLLocation *location;

@property (nonatomic, readonly, copy, nullable) CLRegion *region;

@property (nonatomic, readonly, copy, nullable) NSTimeZone *timeZone ( 9_0))
@property (nonatomic, readonly, copy, nullable) NSDictionary *addressDictionary;
详细地址名(包括等到门牌等)
@property (nonatomic, readonly, copy, nullable) NSString *name;
街道名
@property (nonatomic, readonly, copy, nullable) NSString *thoroughfare;
子街道名
@property (nonatomic, readonly, copy, nullable) NSString *subThoroughfare;
城市
@property (nonatomic, readonly, copy, nullable) NSString *locality;
子城市
@property (nonatomic, readonly, copy, nullable) NSString *subLocality;
行政区域
@property (nonatomic, readonly, copy, nullable) NSString *administrativeArea;
子行政区域
@property (nonatomic, readonly, copy, nullable) NSString *subAdministrativeArea;
@property (nonatomic, readonly, copy, nullable) NSString *postalCode;
@property (nonatomic, readonly, copy, nullable) NSString *ISOcountryCode;
国家
@property (nonatomic, readonly, copy, nullable) NSString *country;
@property (nonatomic, readonly, copy, nullable) NSString *inlandWater;
@property (nonatomic, readonly, copy, nullable) NSString *ocean;
@property (nonatomic, readonly, copy, nullable) NSArray<NSString *> *areasOfInterest;

正地理编码例子

//1. 创建 Geocoder
CLGeocoder *geocoder = [CLGeocoder new];
//2. 调用方法
[geocoder geocodeAddressString:self.addressTF.text completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    //3.1 防错处理
    if (placemarks.count == 0 || error) {
        NSLog(@"没有数据或数据解析出错");
        return;
    }
    //3.2 遍历地标数组placemarks,地理编码容易出现多个地标,应该给用户一个列表去选择
    for (CLPlacemark *pm in placemarks) {
        //3.3 设置纬度
        self.latitudeLabel.text = [NSString stringWithFormat:@"%f",pm.location.coordinate.latitude];
        //3.4 设置经度
        self.longitudeLabel.text = [NSString stringWithFormat:@"%f",pm.location.coordinate.longitude];
        //3.5 设置地址
        self.detailAddressLabel.text = pm.name;
    }
}];

反地理编码例子

//1. 创建 Geocoder 对象
CLGeocoder *geocoder = [CLGeocoder new];
//2. 创建 CLLocation对象,输入经纬度信息
CLLocation *location = [[CLLocation alloc] initWithLatitude:[self.latitudeTF.text floatValue] longitude:[self.longitudeTF.text floatValue]];
//3. 调用反地理编码方法
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    //3.1 防错处理
    if (placemarks.count == 0 || error) {
        NSLog(@"没有数据或数据解析出错");
        return;
    }
    //3.2 遍历数据
    for (CLPlacemark *pm in placemarks) {
        //3.3. 获取城市信息, 如果有城市信息就显示, 否则可以显示行政区域
        if (pm.locality) {
            //locality : 城市
            self.cityLabel.text = pm.locality;
        } else {
            //administrativeArea : 行政区域
            self.cityLabel.text = pm.administrativeArea;
        }
    }
}];

相关文章