CoreLocation(定位)

题外话:

  • 在移动互联网时代,移动app能解决用户的很多生活琐事,比如

    • 导航:去任意陌生的地方
    • 周边:找餐馆,找酒店,找银行,找电影院
  • 在上述应用中都用到了地图定位功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发

    • Map Kit :用于地图展示
    • Core Location:用于地理定位
  • 两个专业术语:

    • LBS :Location Based Service (基于定位的服务)
    • SoloMo : Social Local mobile (所罗门)

1.CoreLocation框架的使用

  • CoreLocation框架使用的前提

  • 导入框架(需要注意的Xcode5以后不需要手动导入,以前需要手动导入)

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

  • 1.CoreLocation框架使用须知

  • 2.CoreLocation框架中所有的数据类型的前缀都是CL

  • 3.CoreLocation 中使用CLLocationManger 对象来做用户定位

  • 最主要的5步(不要怕,很简单,相信我,试着敲下来)

    1.创建CoreLocation 管理者(最好采用懒加载,管理者对象永远不死)

    -(CLLocationManager *)locationManger
    {
           if (!_locationManger) {
      
           //1.创建CoreLocation 管理者
             _locationManger = [[CLLocationManager alloc]init];
        }
    
      return _locationManger;
    
    }
    

    2.成为CoreLocation 管理者的代理监听获取到的位置(遵守协议)

      self.locationManger.delegate = self;
    

    3.定位授权,还需要在在info.plist里面进行配置(仅仅在大于等于ios8里面才要求用户主动授权,这是出于对安全性的要求)

     //授权(这是一个方法)
    
     if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
      
        NSLog(@"是ios8");
       //主动要求用户对我们的程序授权,授权状态改变就会通知代理
       [self.locationManger requestAlwaysAuthorization];//请求前台和后台定位权限
      //[self.locationManger requestWhenInUseAuthorization];//请求前台定位权限
    
    }
    else
      {
          NSLog(@"不是iOS8");
      }
    

** 配置的方法:点击 requestAlwaysAuthorization **

*配置的方法*

4.开始监听(开始获取位置)

[self.locationManger startUpdatingLocation];

NSLog(@"开始定位");

5.实现代理方法

   /*
*  获取到位置信息之后就会被调用
*
*  @param manger   触发事件的对象
*
*  @param locations  获取到的位置
*/

//这步操作是很耗电的(一定要设置定位暂停)
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{

    NSLog(@"%s",__func__);

    [self.locationManger stopUpdatingLocation];

    NSLog(@"定位结束");

}

对于上面其他的一些设置

1.设置获取位置的精确度
如:self.locationManger.distanceFilter = kCLLocationAccuracyNearestTenMeters;

   kCLLocationAccuracyBestForNavigation 
   kCLLocationAccuracyBest;
   kCLLocationAccuracyNearestTenMeters;
   kCLLocationAccuracyHundredMeters;
   kCLLocationAccuracyKilometer;
   kCLLocationAccuracyThreeKilometers;

2.设置多久距离获取一次location

self.locationManger.distanceFilter = 500; //filter |ˈfɪltə(r) 过滤

3.何时开启定位?(获取权限之后)

  -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{

/*
    //1.用户从未选择过授权
    kCLAuthorizationStatusNotDetermined = 0
    //2.无法使用定位服务,该状态用户无法改变
    kCLAuthorizationStatusRestricted
    //3.用户拒绝该应用定服务,或是定位服务总开关出于关闭状态
    kCLAuthorizationStatusDenied
    //4.已经授权(废弃)
    kCLAuthorizationStatusAuthorized
    //5.用户允许该程序无论何时都可以使用地理信息
    kCLAuthorizationStatusAuthorizedAlways
    //6.用户同意程序在可见时使用地理位置
    kCLAuthorizationStatusAuthorizedWhenInUse
 
    ****"最主要是后两个:定位成功"******
 */

    if (status == kCLAuthorizationStatusNotDetermined) {
    
          NSLog(@"等待用户授权");
    }else if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse)
    {

          NSLog(@"授权成功");
    
         //4.开始监听(开始获取位置)
    
         [self.locationManger startUpdatingLocation];
    
         NSLog(@"开始定位");

   }else
    {
         NSLog(@"授权失败");

    }

}

2.打印定位信息

latitude |ˈlætɪtjuːd, American -tuːd| 纬度
longitude |ˈlɒndʒɪtjuːd, American ˈlɔːndʒɪtuːd| 经度
degree |dɪˈgriː| 度
coordinate |kəʊˈɔːdɪnət |noun 坐标

   //7.监听定位信息

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{

 CWLog(@"%s",__func__);

//8.获取CLLocation对象(获取用户最后一次的位置)
/*
 
 location.coordinate; 坐标,包含经纬度
 location.altitude;设置海拔高度,单位是米
 location.course;设置前进方向 0表示北 90东  180南  270西 
 location.horizontalAccuracy; 水平精准度
 location.verticalAccuracy;  垂直精准度
 location.timeatamp;定位信息返回的时间
 location.speed; 设备移动速度 单位是米/秒 ,适于行车速度而不太适于步行

 */
 /*
  可以设置模拟器的速度
  bicycle ride  骑车速度
  run 跑步
  freeway drive  告诉公路驾车
  */

CLLocation *location = [locations lastObject];

NSLog(@"经度=%f 纬度=%f  speed = %f",location.coordinate.latitude,location.coordinate.longitude,location.speed);

//如果只需要获取一次,可以获取到位置之后就停止
 //[self.locationManager stopUpdatingLocation];

 CWLog(@"关闭定位");
}

3.回顾一下CLLocationManger 的常用操作

  • 1.开始用户定位
    -(void)startUpdatingLocation;

  • 2.停止用户定位
    -(void)stopUpdatingLocation;

  • 当用户调用了startUpdatingLocation的方法之后,就开始不断地定位用户的位置,中途会频繁的调用代理的下面方法
    -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations

location 参数里面装着CLLocation的对象

CLLocation的一些属性

4.有关-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations方法里面的一些操作(做一个类似导航的东西,界面自己布局)

声明

//上一次的位置
@property(nonatomic,strong)CLLocation *previousLocation;//previous |ˈpriːvɪəs| 先前的
//计算总的距离
@property(nonatomic,assign)CLLocationDistance sumDistance;
//记录总时间
@property(nonatomic,assign)NSTimeInterval sumTime;

方法的实现

 //6.定位调用

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{

CWLog(@"定位信息打印");


/*  CLLocation 属性
    
 timestap  获取到当前位置信息的时间
 
 */

/*
    获取走了多远(用这一次的位置减去上一次的时间)
    获取走这段路花了多长时间(这一次的时间减去上一次的时间)
    获取速度(走了多远 / 花了多少时间)
    获取总共走的路程 (把每次获取到走了多远累加起来)
    获取平均速度  (总路程 / 总时间)
 */

CLLocation *newlocation = [locations lastObject];

if (self.previousLocation != nil) {
    
    //计算两次的距离(单位是米)
    
   CLLocationDistance distance = [newlocation distanceFromLocation:self.previousLocation];
    
    //计算两次之间的时间(单位是秒)
    
   NSTimeInterval dTime = [newlocation.timestamp timeIntervalSinceDate:self.previousLocation.timestamp];
    
    //计算速度(米/秒)
    
    CGFloat speed = distance/dTime;
    
    CWLog(@"距离=%f 时间=%f 速度=%f ",distance,dTime,speed);
    
    //累加时间
    
    self.sumTime += dTime;
    
    //累加距离
    
    self.sumDistance += distance;
    
    //计算平均速度
    
    CGFloat averangeSpeed = self.sumDistance/self.sumTime;
    
     CWLog(@"两次之间的距离=%f 时间=%f 当前速度=%f 全程时间= %f  全程距离= %f 全程的平均速度 = %f",distance,dTime,speed,self.sumTime,self.sumDistance,averangeSpeed);

   }
   //记录上一次的位置
   self.previousLocation = newlocation;

}

提示:

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

推荐阅读更多精彩内容