CoreLocation框架之APP定位

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CoreLocation框架之APP定位相关的知识,希望对你有一定的参考价值。

#import "ViewController.h"

//导入CoreLocation库后导入其头文件

#import <CoreLocation/CoreLocation.h>

//ios8开始,框架的导入也可以使用这种方式

//@import CoreLocation;

 

@interface ViewController ()<CLLocationManagerDelegate>

@property (nonatomic, strong)CLLocationManager *lm;

@end

 

@implementation ViewController

//懒加载

- (CLLocationManager *)lm

{

    if(!_lm)

    {

        //定位要使用的类

        _lm = [[CLLocationManager alloc] init];

    }

    return _lm;

}

 

- (void)viewDidLoad {

    [super viewDidLoad];

    

    

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

 

    self.lm.delegate = self;

    //请求前台定位授权(当用户在使用APP的时候才有权限去使用定位权限)

    [self.lm requestWhenInUseAuthorization];

    //请求前后台定位授权.

//    [self.lm requestAlwaysAuthorization];

    //版本适配

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >=9.0) {

    //iOS9开始如果要使用后台定位,必须实现这个属性为YES

        //如果请求的定位权限是在前台定位,而需要在后台也是用定位时,可以勾选capabilities中的后台模式,但是此时会有蓝条出现

        self.lm.allowsBackgroundLocationUpdates = YES;

    }

    //版本适配方法2

//    if ([self respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)])

//    {

//        [self.lm setAllowsBackgroundLocationUpdates:YES];

//    }

 

    /*

     kCLLocationAccuracyBestForNavigation导航定位

     CLLocationAccuracy kCLLocationAccuracyBest最精确定位

     CLLocationAccuracy kCLLocationAccuracyNearestTenMeters 10米内

     CLLocationAccuracy kCLLocationAccuracyHundredMeters 100米内

     CLLocationAccuracy kCLLocationAccuracyKilometer 1公里内

     CLLocationAccuracy kCLLocationAccuracyThreeKilometers 3公里内

    */

    //定位精度.定位精度越精确,越耗电

    self.lm.desiredAccuracy = kCLLocationAccuracyBest;

    //位置过滤,当用户位置移动超过10米时再次定位,若位置静止或移动小于10米则不定位.

//    self.lm.distanceFilter = 10;

    

    //开始请求用户位置,此方法会从定位精度最差一级开始定位,若在超时时间内定位到,则返回定位信息,若未定位到设定的定位精度就到达超时时间,就返回当前定位到的精度位置信息.若超时后用户还未决定是否允许定位或未定位到任何位置信息就会调用locationManager:didFailWithError:

    //但是此方法不能同时和startUpdatingLocation同时使用,并且必须实现协议方法locationManager:didFailWithError:

//    [self.lm requestLocation];

    

    //开始更新位置

    [self.lm startUpdatingLocation];

    

    //位置更新后,需要通过某种方式将更新后的位置信息通知到用户,方法有:代理,block,通知.

}

//当位置更新后的回调方法

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

{

    NSLog(@"位置已更新");

    //停止定位

//    [manager stopUpdatingLocation];

}

 

//定位失败

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

{

    NSLog(@"定位失败");

} 

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end

 

 

 

 

技术分享

技术分享

技术分享

以上是我实现权限访问的定位,下面说一下plist文件

技术分享

这是我最终的plist文件,里面的前后台,前台,使用定位请求是自己加进去的;至于使用定位请求的key是:

NSLocationUsageDescription(在CLLocationManager.h文件的第187行),至于前面的那个Privacy是系统自己加进去的,不必纠结于此;

另外,要想实现前后台都可以使用定位,还必须去工程的TARGETS里面,选择(第二个)Capabilities,在Capabilities中再选择Background Modes,将开关打开,并在其中的第二项Location updates前面打对勾;

技术分享

这样你就要可以完美运行你的工程项目了.

 

以上是关于CoreLocation框架之APP定位的主要内容,如果未能解决你的问题,请参考以下文章

不使用 coreLocation 框架的 iphone 定位

:使用CoreLocation定位

IOS-CoreLocation

检测 App 是不是链接到 CoreLocation 框架

CoreLocation 定位

CoreLocation导航Demo