ios-Core Location框架

现在的app中基本都会有定位功能,如果要实现定位工程的话其实就是基于Core Location框架来做的。

如果我们要使用Core Location框架直接导入头文件就可以使用了#import <CoreLocation/CoreLocation.h>

具体使用步骤的话如下所示

1、创建Core Location的管理者CLLocationManager

2、设置Core Location的管理者的代理,实现监听方法

3、开始获取位置,或者开始获取方向

需要注意的是我们在创建管理者对象的时候要把它定义成属性,不然的话如果管理者是局部变量,那相应的函数执行完就释放了,肯定无法再去响应事件了。

开始获取位置,需要用户授权,这里需要注意的是在我们开启定位服务的时候,经过真机测试,如果手机没有移动,我们调用了下面这个函数,刚开始会先去调用didUpdateLocations:(NSArray<CLLocation *> *)locations这个函数,然后如果手机保持不动的话不会再去调用这个函数,但是一旦我们手机的位置发生改变就会一直的调用这个方法,就算你手机停止了还是会一直调用。所以我们最好获取位置之后就关闭位置的获取,或者去设置一些其他的约束条件,比如说设置distanceFilter

[self.manager startUpdatingLocation];
开始获取用户的方向,不需要授权

[self.manager startUpdatingHeading];

设置位置变了多少去更新位置,这样就不会一直的去获取位置了

self.manager.distanceFilter = 500;

我们还可以设置位置的精确度, 定位精度,精度越高需要定位的时间越长,越耗电,所以如果我们没有太大的需求的话尽量使用低精度的,减少与卫星之间的计算

self.manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;

位置的精确度有如下几种选项

    CLLocationAccuracy kCLLocationAccuracyBestForNavigation API_AVAILABLE(ios(4.0), macos(10.7)); 最佳导航
    CLLocationAccuracy kCLLocationAccuracyBest;最精确的
    CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;10米
    CLLocationAccuracy kCLLocationAccuracyHundredMeters;百米
    CLLocationAccuracy kCLLocationAccuracyKilometer;千米
    CLLocationAccuracy kCLLocationAccuracyThreeKilometers;3千米

授权状态改变会调用的函数

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    
    //用户从未选择过
//    kCLAuthorizationStatusNotDetermined
    //无法使用定位服务,这个状态用户无法改变
//    kCLAuthorizationStatusRestricted
    //用户拒绝应用使用定位服务,或者定位服务总开关处于关闭状态
//    kCLAuthorizationStatusDenied
    //用户允许该程序无论何时都可以使用地理信息
//    kCLAuthorizationStatusAuthorizedAlways
    //用户同意程序在用的时候获取地理位置,就是在前台的时候
//    kCLAuthorizationStatusAuthorizedWhenInUse
    
   
    //授权状态改变就会通知代理
   if(status==kCLAuthorizationStatusNotDetermined)
   {
       NSLog(@"等待用户授权");
   }
   else if(status == kCLAuthorizationStatusAuthorizedAlways||status ==kCLAuthorizationStatusAuthorizedWhenInUse)
    {
     
        NSLog(@"授权成功");
         [self.manager startUpdatingLocation];
    }
}

还有就是如果要设置定位的话,我们就要在代码中去设置相应的权限

如果是前后台模式就要去设置manager的requestAlwaysAuthorization

如果仅仅设置前台模式就要去设置manager的requestWhenInUseAuthorization

而且我们要去设置plist文件中相应的权限

简单介绍下CLLocation中的一些属性

location.coordinate;代表的是坐标
     location.altitude;代表的是设备的海拔坐标,单位是米
     location.course; 设置前进的方向,0代表北,90东,180南,270西
     location.horizontalAccuracy 代表的是水平精准度
     location.verticalAccuracy 垂直精准度
     location.timestamp 代表的是定位信息返回的时间
     location.speed代表设置的移动的速度,单位是米/秒

还有就是在我们设置了开始获取方向的时候,如果方向有改变就会调用下面的函数其中

-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
    /**真北(True North, TN)是大家看地图或者地球仪上所有经线的起始点,也叫地理北极。真正的北极点很难测量,要用到卫星,所以我们在日常生活中地图中用到的
     只是磁北*/
    /**磁北(magnetic north)是指南针所指示的北,这主要是由于地球的磁场两极与地理上的南北两极不重合,因此指南针指示的北为磁北而非真北,磁北会随着时间而
     变化*/
   //与磁北的相对角度
   newHeading.magneticHeading;
    //与真北的相对角度
    newHeading.trueHeading
}

计算两个位置之间的距离

CLLocationDistance distance =[newLocation distanceFromLocation:self.previousLocation];
计算两个位置相差的时间

NSTimeInterval time = [newLocation.timestamp timeIntervalSinceDate:self.previousLocation.timestamp];
在这里还要一点提示的是,如果我们想要在设置临时的后台也可以获取位置或者更新位置有个地方一定要去设置

还有就是如果我们只设置了下面的这个属性,而不去设置Background Modes程序就会崩溃

self.manager.allowsBackgroundLocationUpdates = true;

如何去设置Background Modes,如下图所示


监测某个区域,这里需要传一个区域的参数,所以我们就要去创建一个

[self.manager startMonitoringForRegion:circular];

创建一个区域

    //首先创建中心点
    CLLocationCoordinate2D center = CLLocationCoordinate2DMake(30.3, 120.2);
    //创建圆形的区域,指定区域的中心点的经纬度,和半径
    CLCircularRegion * circular = [[CLCircularRegion alloc]initWithCenter:center radius:500 identifier:@"test"];
以及实现下,在进入这个区域和出这个区域会调用的方法

//进入监听区域时会去调用
-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    NSLog(@"进入监听的区域内调用");
}
//离开监听区域时调用
-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
    NSLog(@"离开监听区域内调用");
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值