地图(一)之CoreLocation

CoreLocation

CoreLocation用于地理定位,地理编码区域监听等(着重功能实现)

1.获取定位授权

iOS6+

  • 当使用定位时用户会自动弹出对话框询问用户是否授权,当用户选择不允许,应用程序以后都不能获取定位权限
  • 开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)

iOS8+

1.系统不会主动请求定位,需要开发者通过代码请求授权

[_localManager requestWhenInUseAuthorization]; // 请求前台授权 
[_localManager requestAlwaysAuthorization]; // 请求总是授权(前后台授权)
/*
注意:当设置为前台授权时,通过设置后台模式:location updates后 也可以后台获取定位信息,但是屏幕上方会出现蓝条
*/

2.开发者需要在Info.plist中配置对应的键值, 否则以上请求授权的方法不生效

  • NSLocationAlwaysUsageDescription : 允许在前后台获取定位的描述
  • NSLocationWhenInUseDescription : 允许在前台获取定位的描述

iOS9+

  • 同样需要开发者通过代码请求授权及在Info.plist中配置对应的键值
[_localManager requestWhenInUseAuthorization]; // 请求前台授权 
[_localManager requestAlwaysAuthorization]; // 请求总是授权(前后台授权)
/*
注意:当设置为前台授权时,除了设置后台模式:location updates,还要设置_localManager.allowsBackgroundLocationUpdates = YES,屏幕上方同样会出现蓝条
*/
  • 新增API
-(void)requestLocation//单次请求用户位置
-(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations // 成功调用
-(void)locationManager:(nonnull CLLocationManager *)manager didFailWithError:(nonnull NSError *)error // 失败调用
/*
注意:
(1) 必须实现代理的-locationManager:didFailWithError:方法
(2) 不能与startUpdatingLocation方法同时使用
*/

iOS11+

在info.plist中配置NSLocationWhenInUseUsageDescription和NSLocationAlwaysAndWhenInUsageDescription来实现前后台定位

2.CLLocationManager

CoreLocation框架中使用CLLocationManager对象来做用户定位
常用属性

//初始化CLLocationManager对象
 _locationManger = [[CLLocationManager alloc] init];
 //设置代理
_locationManger.delegate = self;
//设置定位精确度
_locationManger.desiredAccuracy = kCLLocationAccuracyBest;
 //每隔多少米定位一次
_locationManger.distanceFilter = 100;
        
 if (@available(iOS 8.0, *)) {
      // 请求前台定位授权
      [_locationManger requestWhenInUseAuthorization];
      if (@available(iOS 9.0, *)) {
         // iOS9.0+ 设置允许后台位置更新
         _locationManger.allowsBackgroundLocationUpdates = YES;
        }
  }

常用方法

//开始定位
[self.locationManger startUpdatingLocation];
//开始监听设备朝向
[self.locationManger startUpdatingHeading];
//停止定位
[self.locationManger stopUpdatingLocation];
//停止监听设备朝向
[self.locationManger stopUpdatingHeading];

常用代理方法

//更新位置时调用
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    NSLog(@"更新定位了");
}
//更新朝向时调用
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
    
}
//进入区域时调用
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
    NSLog(@"进入%@附近100米",region.identifier);
}
//离开区域时调用
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{
   NSLog(@"离开%@附近100米",region.identifier);
}
//判断是否在某个区域时的状态
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region{
    NSLog(@"%zd", state);
}
//授权状态改变时调用
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
    switch (status) {
        case kCLAuthorizationStatusNotDetermined:
            NSLog(@"用户未决定(请求授权之前的状态)");
            break;
        case kCLAuthorizationStatusRestricted:
            NSLog(@"访问受限制");
            break;
        case kCLAuthorizationStatusDenied:  // 定位关闭时和对此APP授权为never时调用
            if([CLLocationManager locationServicesEnabled]){
                // 定位服务开启了
                NSLog(@"永不或者不允许Not Allow");
            } else {
                NSLog(@"定位服务关闭了");
                // 先允许定位,然后关闭掉定位服务,再开始定位startUpdatingLocation时系统会弹出设置定位服务打开弹框
            }
            break;
        case kCLAuthorizationStatusAuthorizedAlways://
            NSLog(@"始终:前后台");
            break;
        case kCLAuthorizationStatusAuthorizedWhenInUse://
            NSLog(@"应用使用期间:前台");
            break;
        default:
            break;
    }
}

3.CLLocation

CLLocation对象用来存储CLLocationManager对象生成的位置数据
常用属性

CLLocation *location = [locations lastObject];
    
CLLocationCoordinate2D coordinate = location.coordinate;//经纬度
CGFloat altitude = location.altitude;//海拔
CGFloat horizontalAccuracy = location.horizontalAccuracy; // 水平精度,如果值是复数代表无效
CGFloat verticalAccuracy = location.verticalAccuracy; // 垂直精度,如果值是复数代表无效
CGFloat course = location.course;//方向
CGFloat speed = location.speed;//速度

4.CLGeocoder

CLGeocoder对象用于处理地理编码和反地理编码功能

//地理编码
-(void)getCoordinateByAddress{
    [self.geocoder geocodeAddressString:self.addressField.text completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        //取得第一个地标,地标中存储了详细的地址信息,注意:一个地名可能搜索出多个地址
        CLPlacemark *placemark = [placemarks firstObject];
        
    }];
}

//反地理编码
-(void)getAddress{
    CLLocation *location = [[CLLocation alloc] initWithLatitude:self.latitudeField.text.doubleValue
                longitude:self.longitudeField.text.doubleValue];
    [self.geocoder reverseGeocodeLocation:location
                        completionHandler:^(NSArray *placemarks, NSError *error) {
                            CLPlacemark *placemark = [placemarks firstObject];
                            
                        }];
    
}

5.CLPlacemark

CLPlacemark对象代表一个地标,存储了详细的地址信息
具体属性

//以下为CLPlacemark中包含的信息
CLLocation *location = placemark.location;//位置
CLRegion *region = placemark.region;//区域
NSTimeZone * timezone = placemark.timeZone;//时区
NSDictionary *addressDic = placemark.addressDictionary;//详细地址信息字典
        
NSString *name = placemark.name;//地名
NSString *thoroughfare = placemark.thoroughfare;//街道
NSString *subThoroughfare = placemark.subThoroughfare; //街道相关信息,例如门牌等
NSString *locality = placemark.locality; // 城市
NSString *subLocality = placemark.subLocality; // 城市相关信息,例如标志性建筑
NSString *administrativeArea = placemark.administrativeArea; // 州
NSString *subAdministrativeArea = placemark.subAdministrativeArea; //其他行政区域信息
NSString *postalCode = placemark.postalCode; //邮编
NSString *ISOcountryCode = placemark.ISOcountryCode; //国家编码
NSString *country = placemark.country; //国家
NSString *inlandWater = placemark.inlandWater; //水源、湖泊
NSString *ocean = placemark.ocean; // 海洋
NSArray *areasOfInterest = placemark.areasOfInterest; //关联的或利益相关的地标

参考:完整项目资料下载

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容