IOS-CLLocationManager的定位功能

注:在测定位功能的时候,比较多人会奇怪,为什么代码已经写好了,可是测试的时候,只有首次启动模拟器定位代码才有效。那是因为模拟器除了首次启动的时候会有默认的定位位置(默认位置是苹果美国总部),其它时候都需要你手动的去开启,在调试->位置->自定位置(填写经纬度)。

.h

1 #import <CoreLocation/CoreLocation.h>
2
3 // 定位管理器,作用是:定位当前用户的经度和纬度
4 @property (nonatomic, strong) CLLocationManager *locationManager;
5 @property (nonatomic, strong) CLGeocoder *geocoder;

.m

 1 - (id)init
 2 {
 3     if (self = [super init]) {
 4         // 定位管理器
 5         _locationManager = [[CLLocationManager alloc] init];
 6         _geocoder = [[CLGeocoder alloc] init];
 7         // 当它定位完成,获得用户的经度和纬度时,会通知代理
 8         _locationManager.delegate = self;
 9     }
10
11     return self;
12 }
13
14 #pragma mark 启动定位
15 - (BOOL)startGetLocation
16 {
17     if ([CLLocationManager locationServicesEnabled]) {19         // 定位管理器 开始更新位置
20         [_locationManager startUpdatingLocation];
21         return YES;
22     } else {
23         DLog(@"定位服务当前可能尚未打开!");25         return NO;
26     }
27 }

CLGeocoder是一个地理编码器,可以把城市名反编码成经纬度或相反,这个后面会有用到。而以上就是用CLLocationManager启动定位的一个过程,先判断程序的定位服务是否允许,然后用startUpdatingLocation启动定位功能。

 1 #pragma mark - 定位管理器 代理方法
 2 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
 3 {
 4     // 1.既然已经定位到了用户当前的经纬度了,那么可以让定位管理器 停止定位了
 5     [_locationManager stopUpdatingLocation];
 6     // 2.然后,取出第一个位置,根据其经纬度,通过CLGeocoder反向解析,获得该位置所在的城市名称
 7     CLLocation *loc = [locations firstObject];
 8
 9     [self getAddressByLocation:loc];
10 }
11
12 #pragma mark 根据坐标取得地名
13 -(void)getAddressByLocation:(CLLocation *)location
14 {
15 //    __weak __typeof(self)weakSelf = self;
16     //反地理编码
17     [_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
18         CLPlacemark *placemark = [placemarks firstObject];
19         NSString *locality = placemark.locality;
20         NSRange range = [locality rangeOfString:@"市"];
21         if (range.length > 0) {
22             // 将最后一个字符【市】去掉
23             locality = [placemark.locality substringToIndex:placemark.locality.length - 1]; // 城市
24         }
25         NSLog(@"locality : %@", locality);
26
27 //        if ([weakSelf.delegate respondsToSelector:@selector(didFinishLocations:error:)]) {
28 //            weakSelf.locationState = SuSLocationFinish;
29 //            [weakSelf.delegate didFinishLocations:[placemarks firstObject] error:error];
30 //        }
31     }];
32 }

启动后通过代理方法locationManager:didUpdateLocations:我们就可以获得定位位置的经纬度,然后就是需要用到CLGeocoder地理编码器的时候了,用方法reverseGeocodeLocation:completionHandler:反编码获得一个CLPlacemark对象,然后定位的信息就都存在该对象内了。CLPlacemark相应的属性可以参考以下代码:

 1      CLLocation *location = placemark.location;//位置
 2         CLRegion *region=placemark.region;//区域
 3         NSDictionary *addressDic= placemark.addressDictionary;//详细地址信息字典,包含以下部分信息
 4         NSString *name=placemark.name;//地名
 5         NSString *thoroughfare=placemark.thoroughfare;//街道
 6         NSString *subThoroughfare=placemark.subThoroughfare; //街道相关信息,例如门牌等
 7         NSString *locality=placemark.locality; // 城市
 8         NSString *subLocality=placemark.subLocality; // 城市相关信息,例如标志性建筑
 9         NSString *administrativeArea=placemark.administrativeArea; // 州
10         NSString *subAdministrativeArea=placemark.subAdministrativeArea; //其他行政区域信息
11         NSString *postalCode=placemark.postalCode; //邮编
12         NSString *ISOcountryCode=placemark.ISOcountryCode; //国家编码
13         NSString *country=placemark.country; //国家
14         NSString *inlandWater=placemark.inlandWater; //水源、湖泊
15         NSString *ocean=placemark.ocean; // 海洋
16         NSArray *areasOfInterest=placemark.areasOfInterest; //关联的或利益相关的地标

如若你还需要通过城市名来获取经纬度,则你可以使用以下方法:

 1 #pragma mark 根据地名确定地理坐标
 2 - (void)getCoordinateByAddress:(NSString *)address
 3 {
 4     //地理编码
 5     [_geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {
 6         //取得第一个地标,地标中存储了详细的地址信息,注意:一个地名可能搜索出多个地址
 7         CLPlacemark *placemark = [placemarks firstObject];
 8
 9         DLog(@"位置=%@-->纬度=%f----经度=%f", address, placemark.location.coordinate.latitude, placemark.location.coordinate.longitude);
10     }];
11 }
时间: 2024-08-26 12:25:44

IOS-CLLocationManager的定位功能的相关文章

iOS 自带定位功能

第一步:导入头文件 #import <CoreLocation/CoreLocation.h> #import <CoreLocation/CLLocationManagerDelegate.h> 第二步:设置代理 CLLocationManagerDelegate 第三步:创建一个属性 @property(nonatomic, strong) CLLocationManager *locationManager; 第四步:初始化     //定位服务管理对象初始化     _lo

iOS 地图和定位功能

1:定位使用的生活场景 在移动互联网时代,移动app能解决用户的很多生活琐事,比如导航:去任意陌生的地方 周边:找餐馆.找酒店.找银行.找电影院 在上述应用中,都用到了地图和定位功能 2:iOS定位依赖的框架 在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发 Map Kit :用于地图展示(比较重量级) Core Location :用于地理定位 Map Kit的定位是基于Core Location的 iOS定位热门术语: LBS :Location Based Service So

iOS地图及定位功能基本实现的详尽描述

首先创建一个viewController: 添加MapKit,CoreLocation框架 一.添加地图 1.初始化地图视图: @property (nonatomic, strong) MKMapView *mapView; self.mapView =[[MKMapView alloc]initWithFrame:self.view.bounds]; 2.设置地图的显示类型,三种:标准,卫星地图,混合 self.mapView.mapType { MKMapTypeStandard = 0,

iOS开发--添加定位功能

.h 首先在头文件中#import <CoreLocation/CoreLocation.h> 添加CLLocationManagerDelegate协议 @property (strong, nonatomic) IBOutlet CLLocationManager *myLocationManager; .m 在- (void)viewDidLoad添加以下代码: self.myLocationManager=[[CLLocationManager alloc]init]; [self.m

IOS 开启定位功能 CLLocationManager 介绍-简单使用

iOS 中的定位功能,主要在 CoreLocation库中,需要用到位置管理器 CLLocationManager 来完成绝大多数事情. 要使用 CLLocationManager 首先需要一个对象~ 以及对它进行简单的设置,最后开启定位功能, 就开始定位了,定位成功或者失败后都会调用代理方法返回信息 1 CLLocationManager *manger; 2 3 manger = [[CLLocationManager alloc] init]; //初始化 4 5 manger.deleg

iOS开发 -- 实现简单的定位功能

一.定位的说明 现在的应用很多都拥有定位功能.确实,定位功能是很好用的,对我们的生活也有很大的帮助.例如帮你找酒店,找银行等等... 要实现定位有三种方式:   1. 手机基站:(依赖于手机机战(信号塔)的密集程度)  2. GPS:卫星定位,精确度高,但是费电     3. WIFI:根据上网的IP地址,(必须要能上网) 而我们开发中一般都是用GPS定位比较多,我们要实现定位需要用到CoreLocation框架,CoreLocation中主要包含了定位.地理编码(包括反编码)功能. 在iOS8

iOS CLLocationManager定位

在iOS8以前的版本中,我们使用CLLocationManager定位是没有问题的,最近在iOS8系统中却无法定位了....这是一大问题啊! 1.首先定义一个全局的变量用来记录CLLocationManager对象,引入CoreLocation.framework使用#import <CoreLocation/CoreLocation.h> @property (nonatomic, strong) CLLocationManager *locationManager; 2.初始化CLLoca

iOS CLLocationManager定位,IOS8注意

今天下午动手用了IOS自带的定位,结果在网上看了很多教程,也将示例代码直接运行,但就是一直无法获取位置,代码如下: 首先导入CoreLocation.framework,然后再引入头文件#import  定义属性 ? 1 @property (nonatomic , strong)CLLocationManager *locationManager; 然后使用代理 CLLocationManagerDelegate - (void)locate{ // 判断定位操作是否被允许 if([CLLoc

ios项目开发— iOS8 定位功能API改变

iOS8 定位新增功能 一.  Core Location framework的变化主要有以下几点:         1. 在定位状态中引入Always 和WhenInUse的概念.         2. 加入Visit monitoring的特性, 这类特性特别适合旅行类别的应用,当用户到达某个指定的区域内,monitor开始作用.         3.加入室内定位技术,增加CLFloor, 在室内可以得到楼层信息. 下面针对这三种分别详细的讲一下使用方法. 二..定位的种类分为: 持续的更新

定位功能

实现iOS定位功能首要步骤:当时是新建一个工程啦~ !~ 步骤一:导入系统定位的类库  CoreLocation.framework 步骤二: 需要在plist文件中添加默认缺省的字段“NSLocationAlwaysUsageDescription”,这个提示是:“允许应用程序在您并未使用该应用程序时访问您的位置吗?”NSLocationAlwaysUsageDescription对应的值是告诉用户使用定位的目的或者是标记.(无论有用没用应用程序,都获得用户位置) 需要在plist文件中添加默