标签:
#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前面打对勾;
这样你就要可以完美运行你的工程项目了.
标签:
原文地址:http://www.cnblogs.com/ZhangRuiZhi/p/5971375.html