【iOS开发-109】CoreLocation框架的两个主要类CLLocationManager和CLGeoCoder介绍

CoreLocation框架主要由两个常用的类,一个是CLLocationManager,一个是CLGeoCoder。

(1)CoreLocation的使用,先导入CoreLocation框架。

(2)一般是利用位置管理器来操作,即CLLocationManager

——开启,就是startUpdatingLocation;关闭,就是stopUpdatingLocation

——可以先判断位置服务是否开启locationServicesEnabled,如果没开启,直接返回空,不操作。

——iOS8的推送信息,需要获得用户允许,注册以下推送通知

——位置类CLLocation有很多属性,包括方向course,还有坐标coordinate,coordinate有经纬度属性latitude和longitude。

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

@interface ViewController ()<CLLocationManagerDelegate>
@property(nonatomic,strong) CLLocationManager *locMgr;
@end

@implementation ViewController
-(CLLocationManager *)locMgr{
    //判断,定位服务是否开启,如果没开启,直接返回nil,不执行下面的操作
    if (![CLLocationManager locationServicesEnabled]) return nil;

    if (!_locMgr) {
        _locMgr=[[CLLocationManager alloc]init];
    }
    return _locMgr;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    if ([[UIDevice currentDevice].systemVersion doubleValue]>=8.0) {

    }
    //设置代理
    self.locMgr.delegate=self;
    [self.locMgr startUpdatingLocation];
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    CLLocation *loc=[locations firstObject];
    NSLog(@"%f %f",loc.coordinate.latitude,loc.coordinate.longitude);
    //如果只需要调用1次,则立即关闭,因为默认每隔一分钟调用一次这个方法,耗电
    [manager stopUpdatingLocation];
}

@end

——推送通知允许的个性化设置

(3)计算两个位置之间的直线距离

    CLLocation *loc1=[[CLLocation alloc]initWithLatitude:44 longitude:120];
    CLLocation *loc2=[[CLLocation alloc]initWithLatitude:45 longitude:120];
    CLLocationDistance distance=[loc1 distanceFromLocation:loc2];
    NSLog(@"%f",distance);

结果是:111122.007528

表示位置的属性还有海拔等等,用如下方法可以一窥:

CLLocation *loc2=[[CLLocation alloc]initWithCoordinate:(CLLocationCoordinate2D) altitude:(CLLocationDistance) horizontalAccuracy:(CLLocationAccuracy) verticalAccuracy:(CLLocationAccuracy) timestamp:(NSDate *)];

当然,我们可以自己make一个坐标等等。

(4)还有一些针对位置管理器的属性介绍

    //每隔多远距离更新一次
    self.locMgr.distanceFilter=distance;
    //精度设置
    self.locMgr.desiredAccuracy=kCLLocationAccuracyBestForNavigation;

(5)在iOS7中,需要用户授权,但是不需要开发者额外设置,会自动有弹窗出来。但是在iOS8中,尽管注册了推送消息的通知,但是仍然无效,需要有特殊设置:

——首先,最核心的就是调用方法requestWhenInUseAuthorization或者requestAlwaysAuthorization,两者区别在于,一个是告诉用户只在用户使用这个app时访问位置信息,而后者是不管你正在用或者放在后台,都使用位置信息。而且区别在于,如果选择后者的话,那么弹框出来的信息是带有自定义的信息的(即上面所说的个性化设置说明信息)。

- (void)viewDidLoad {
    [super viewDidLoad];
    if ([[UIDevice currentDevice].systemVersion doubleValue]>=8.0) {
        [self.locMgr requestWhenInUseAuthorization];
    }
    [self.locMgr startUpdatingLocation];
}

——当然,仅仅调用以上语句还是不够。还需要在info.plist中添加对应的属性,当然,两个都添加了也没事。

(6)如果不需要关心用户的地点信息,只需要简单地经纬度和地址之间的转换,那么就是地理编码和发地理编码。

地理编码:把地点名称,转换成经纬度以及更详细的地址。反地理编码,就是输入经纬度,获取详细地址。主要代码如下:

- (IBAction)geoCode:(id)sender {
    if (self.addressField.text.length==0) return;
    [self.geocoder geocodeAddressString:self.addressField.text completionHandler:^(NSArray *placemarks, NSError *error) {
        if (error) {
            [email protected]"找不到你输入的详细地址";
        }else{
            CLPlacemark *pm=[placemarks firstObject];
            self.longitudeLabel.text=[NSString stringWithFormat:@"%.1f",pm.location.coordinate.longitude];
            self.latitudeLabel.text=[NSString stringWithFormat:@"%.1f",pm.location.coordinate.latitude];
            self.detailAddressLabel.text=pm.name;
        }
    }];
}
- (IBAction)reverseGeoCode:(id)sender {
    if (self.reverseLongitudeField.text.length==0 || self.reverseLatitudeField.text.length==0) return;
    CLLocation *loc=[[CLLocation alloc]initWithLatitude:[self.reverseLatitudeField.text doubleValue] longitude:[self.reverseLongitudeField.text doubleValue]];
    [self.geocoder reverseGeocodeLocation:loc completionHandler:^(NSArray *placemarks, NSError *error) {
        if (error) {
            [email protected]"这是什么经纬度?";
        }else{
            CLPlacemark *pm=[placemarks firstObject];
            self.reverseDetailAddressLabel.text=pm.name;
        }
    }];
}

(7)补充CLLocationManager的另一个知识,范围的监控。比如360儿童手表的进入某个区域和离开某个区域就警报的功能。

——得遵守协议<CLLocationManagerDelegate>

——然后,创建一个区域,下面的第一个方法已经报销了,现在用第二个方法,即CLRegion用CLCircularRegion来创建这个不太容易想到。

CLRegion *region=[[CLRegion alloc]initCircularRegionWithCenter:(CLLocationCoordinate2D) radius:(CLLocationDistance) identifier:@"china"];
CLRegion *region=[[CLCircularRegion alloc]initWithCenter:(CLLocationCoordinate2D) radius:(CLLocationDistance) identifier:(NSString *)];

——然后,发起监控

[self.locMgr startMonitoringForRegion:region];

——当然,有代理方法,即进入这个范围或者离开的时候,做什么事情,就在代理方法里做:

-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{

}

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{

}

——当然,关闭监控区域的方法是:

[self.locMgr stopMonitoringForRegion:region];
时间: 2024-08-07 04:24:03

【iOS开发-109】CoreLocation框架的两个主要类CLLocationManager和CLGeoCoder介绍的相关文章

iOS核心笔记—CoreLocation框架-基础

1.CoreLocation框架简介: ?了解:在iOS开发中,要想使用地图和定位功能,必须基于2个框架进行开发.CoreLocation框架:主要用于地理定位:MapKit框架:主要用于地图展示. 1-1.CoreLocation框架功能: 功能 作用 地理定位 定位用户所在位置,获取对应的经纬度.海拔等位置信息 区域监听 事先在APP内部通过代码指定一个区域,当用户进入.或离开该区域的时候,可以通过对应的代理方法监听到用户的位置 地理编码 将详细的位置信息转换为对应的经纬度,即:位置信息 -

iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法. 这里引用一下前文中对 PhotoKit 基本构成的介绍: PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源 PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值 PHAssetCo

iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

这里接着前文<iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)>,主要是干货环节,列举了如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法. 三. 常用方法的封装 虽然 PhotoKit 的功能强大很多,但基于兼容 iOS 8.0 以下版本的考虑,暂时可能仍无法抛弃 ALAssetLibrary,这时候一个比较好的方案是基于 ALAssetLibrary 和 PhotoKit 封装出一系列模拟系统 Asset 类的自定义类,然后在其中封装好兼容 A

[转] iOS --- ReactiveCocoa - iOS开发的新框架

转载唐巧的博客:ReactiveCocoa - iOS开发的新框架

ReactiveCocoa - iOS开发的新框架

本文转载至 http://www.infoq.com/cn/articles/reactivecocoa-ios-new-develop-framework ReactiveCocoa(其简称为RAC)是由Github 开源的一个应用于iOS和OS X开发的新框架.RAC具有函数式编程和响应式编程的特性.它主要吸取了.Net的 Reactive Extensions的设计和实现.本文将详细介绍该框架试图解决什么问题,以及其用法与特点. ReactiveCocoa试图解决什么问题 经过一段时间的研

iOS 开发之照片框架详解

一. 概要 在 iOS 设备中,照片和视频是相当重要的一部分.最近刚好在制作一个自定义的 iOS 图片选择器,顺便整理一下 iOS 中对照片框架的使用方法.在 iOS 8 出现之前,开发者只能使用 AssetsLibrary 框架来访问设备的照片库,这是一个有点跟不上 iOS 应用发展步伐以及代码设计原则但确实强大的框架,考虑到 iOS7 仍占有不少的渗透率,因此 AssetsLibrary 也是本文重点介绍的部分.而在 iOS8 出现之后,苹果提供了一个名为 PhotoKit 的框架,一个可以

iOS开发之缓存框架、内存缓存、磁盘缓存、NSCache、TMMemoryCache、PINMemoryCache、YYMemoryCache、TMDiskCache、PINDiskCache

1.在项目中我们难免会用到一些缓存方式来保存服务器传过来的数据,以减少服务器的压力. 缓存的方式分为两种分别为内存缓存和磁盘缓存,内存缓存速度快容量小,磁盘缓存容量大速度慢可持久化.常见的内存缓存有NSCache.TMMemoryCache.PINMemoryCache.YYMemoryCache.常见的磁盘缓存有TMDiskCache.PINDiskCache.YYCache. 1.本文章着重讲下YYCache. 这是为什么呢,因为他比其他的缓存框架更加高效,使用方便. YYCache: 去掉

IOS开发之自动布局框架设计(二)

[上集剧情概要:上集我们主要剖析了原生的NSLayoutConstraint实现自动布局的方式,我们知道是通过constraintWithItem这个初始化的方法来配备所需要的7个参数,然后通过addConstraint方法将布局添加进去,并且定义了 NSLayoutAttribute,NSLayoutRelation这些枚举] 如果我们自己设计一款布局框架可以怎么设计呢? 1.封装原有的NSLayoutConstraint类,可以将代码的实现更加简洁化.例如:Masonry,SDAutoLay

iOS开发常用第三方框架

1.网络通信 1.ASIHTTPRequest 这是一个经典的老库,功能完全而强大,但已经停止更新很久了(iOS5.0停止更新,但是我最近看github上这个项目有新改动).在不同iOS版本上略微有一些小问题(提醒显示上的),所以用的时候还是稍微修改一下比较好. 下载地址:https://github.com/pokeb/asi-http-request 2.AFNetworking 轻量级的通讯类库,使用非常简单. 下载地址:https://github.com/AFNetworking/AF