CoreLocation(定位)

简介: 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 **


image.png


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


image.png


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];很重要获取


目录
相关文章
|
API 图形学
|
XML JavaScript Java
appium定位-控件定位
客户端的页面通过 XML 来实现 UI 的布局,页面的 UI 布局作为一个树形结构,而树叶被定义为节点。这里的节点也就对应了要定位的元素
CoreLocation第三方框架
CoreLocation第三方框架
127 0
CoreLocation第三方框架
|
定位技术 iOS开发
iOS开发之CoreLocation框架使用
iOS开发之CoreLocation框架使用
384 0
iOS开发之CoreLocation框架使用
|
定位技术 iOS开发
iOS开发之CoreLocation框架使用(三)
iOS开发之CoreLocation框架使用
177 0
|
监控 iOS开发
CoreLocation 框架详细解析
CoreLocation框架详细解析 —— 基本概览(一)CoreLocation框架详细解析 —— 选择定位服务的授权级别(二)CoreLocation框架详细解析 —— 确定定位服务的可用性(三)CoreLocation框架详细解析 —— 获取用户...
831 0
|
定位技术 开发工具 Android开发
Xamarin.Android 使用百度地图获取定位信息
最近做一个项目,web端使用百度地图,PDA使用手持机自带的GPS定位系统获取经纬度,然后再百度地图上显示该经纬度会有一定距离的差异,这里就像可乐的瓶子拧上雪碧的盖子,能拧的上却不美观。所以为了数据的精确性,PDA端也用百度地图的接口。
3367 0