Core Location Framework详解(一)如何获取你当前的定位坐标

相关知识点 CLLocationManager CLAuthorizationStatus Accuracy Constants distanceFilter CLActivityType
开发环境 iOS 8.4 Xcode 6.4
API地址

简述

The Core Location framework lets you determine the current location or heading associated with a device. The framework uses the available hardware to determine the user’s position and heading. You use the classes and protocols in this framework to configure and schedule the delivery of location and heading events. You can also use it to define geographic regions and monitor when the user crosses the boundaries of those regions. In iOS, you can also define a region around a Bluetooth beacon.

根据苹果官方文档的描述,Core Location Framework的用途是使用户通过移动设备来获取定位信息和方向信息,还有你的范围,当用户走过某些范围边界就能马上监控到,在iOS上,甚至可以连同beacon联动来确定周边信息。

现在我主要是通过一些案例来学习这个Framework积累经验,写得不好的话,麻烦吐槽


开始——

首先新建一个项目,这篇文件是讲Core Location Framework,那当然要引入这个Framework,引入后我们在新建项目的ViewController.h引入这个框架ViewController.m引入#import <CoreLocation/CoreLocation.h>并且添加CLLocationManagerDelegate

Paste_Image.png

然后按着Command点击<CoreLocation/CoreLocation.h>,进入看看框架里面的内容,里面就包含了以下这些Class

Paste_Image.png

viewDidLoad函数里面,我们添加以下这段代码

    /************ 初始化地理位置~begin **************/

    if (locationManager == nil){
        locationManager                 = [[CLLocationManager alloc] init];
        
        //要求的精准度
        locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        
        //设置最小距离范围数据更新,单位为米,例如:10.0f为如果水平移动超过10米范围则会更新地理位置信息
        locationManager.distanceFilter  = 10.0f;
        
        /**
         *  @author 老区
         *
         *  这个值是和更新位置信息有关,当一定时间范围内没有检测用户的位置变化的话,则自动暂停位置服务,等到位置发生变化后才唤醒,这个目的是为了节省系统电量
         *  默认值为CLActivityTypeOther
         *  CLActivityTypeAutomotiveNavigation, // 汽车使用
         *  CLActivityTypeFitness,    // 徒步使用
         *  CLActivityTypeOtherNavigation   // 船,火车,飞机使用
         */
        locationManager.activityType    = CLActivityTypeAutomotiveNavigation;
        
        locationManager.delegate        = self;
    }

    
    //检查授权,如果没有这句判断的话在iOS执行会直接出现"unknown selector"
    if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [locationManager requestAlwaysAuthorization];//for iOS 8
    }

    
    //获取地址位置
    [locationManager startUpdatingLocation];

    /************ 初始化地理位置~end **************/


CLLocationManager

The CLLocationManager
class is the central point for configuring the delivery of location- and heading-related events to your app. You use an instance of this class to establish the parameters that determine when location and heading events should be delivered and to start and stop the actual delivery of those events. You can also use a location manager object to retrieve the most recent location and heading data.

这里意思是传递location和heading相关事件到APP上显示。还有就是控制开启和关闭获取地址位置信息和数据,取回之前的位置和方向数据。

这里有几点要注意的地方,就是使用CLLocationManager会询问获取定位功能的授权Requesting Permission to Use Location Services,我们可以根据[Constants]CLAuthorizationStatus来查看其授权状态,


CLAuthorizationStatus(授权状态 )

这里分别有以下几种授权状态——

  • kCLAuthorizationStatusNotDetermined——第一次安装应用的时候用户还没选择是否使用定位服务功能

  • kCLAuthorizationStatusRestricted——这个App的定位服务功能受限,用户无法改变这个App的状态,有可能是由于开启某些限制例如家长控制之类的操作

  • kCLAuthorizationStatusDenied——用户明细地拒绝此App使用定位服务功能或者在用户设置那里禁用定位服务

  • kCLAuthorizationStatusAuthorizedAlways——该APP授权在App任何时候包括前端运行和后端运行使用定位服务

  • kCLAuthorizationStatusAuthorizedWhenInUse——该APP授权在App前端运行的时候使用定位服务

其中这里的两种授权状态WhenInUseAlways都能获取定位服务信息,但WhenInUse只允许用户在App在foreground(前台运行)状态下才能获取位置数据,而Always是任何时候,包括在foreground和background状态下都能获取到数据

重要:如果是iOS 8或之后,你还需要添加 NSLocationWhenInUseUsageDescription和NSLocationAlwaysUsageDescription到Info.plist上才会弹出授权提示

    
    //检查授权,如果没有这句判断的话在iOS执行会直接出现"unknown selector"
    if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [locationManager requestAlwaysAuthorization];//for iOS 8
    }

注意:如果您是先使用requestWhenInUseAuthorization来获取授权的话,之后再使用requestAlwaysAuthorization获取授权的话,会弹出提示用户变更授权状态,但反过来则不行,我认为是Always这个授权是高于WhenInUse,如果你真的要将Always改为WhenInUse的话,则可以通过Setting那里去设置


Accuracy Constants

        //要求的精准度
        locationManager.desiredAccuracy = kCLLocationAccuracyBest;

这里我大概截了下图片,知道有哪些常量就OK

Paste_Image.png

CLActivityType

相关代码说明:

        /**
         *  @author 老区
         *
         *  这个值是和更新位置信息有关,当一定时间范围内没有检测用户的位置变化的话,则自动暂停位置服务,等到位置发生变化后才唤醒,这个目的是为了节省系统电量
         *  默认值为CLActivityTypeOther
         *  CLActivityTypeAutomotiveNavigation, // 汽车使用
         *  CLActivityTypeFitness,    // 徒步使用
         *  CLActivityTypeOtherNavigation   // 船,火车,飞机使用
         */
        locationManager.activityType    = CLActivityTypeOther;

Paste_Image.png

distanceFilter

        //设置最小距离范围数据更新,单位为米,例如:10.0f为如果水平移动超过10米范围则会更新地理位置信息
        locationManager.distanceFilter  = 10.0f;

其中还有一个kCLDistanceFilterNone,这个常量的意思是没有任何范围限制,只要位置发生任何变化都执行更新,但这样会很耗电



最后——

这些都准备好之后执行startUpdatingLocation来获取定位信息

[locationManager startUpdatingLocation];

当成功授权后,便可以通过- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations这个Delegate来获取位置数据

#pragma mark - CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *newLocation = [locations lastObject];
    
    NSLog(@"newLocation lat:%f", newLocation.coordinate.latitude);
    NSLog(@"newLocation lng:%f", newLocation.coordinate.longitude);
}

相关参考文章:
http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/


原创作者:老区
Email: leo.au@foxmail.com
QQ:81508056
微信ID:kingOU

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

推荐阅读更多精彩内容