CoreLocation(定位)

题外话:

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

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

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

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

1.CoreLocation框架的使用

  • CoreLocation框架使用的前提

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

  • 导入头文件 #import

  • 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 *)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 *)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 *)locations

location 参数里面装着CLLocation的对象

CoreLocation(定位)_第1张图片
CLLocation的一些属性

4.有关-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)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 *)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];很重要获取两个位置之间的距离

你可能感兴趣的:(CoreLocation(定位))