CoreLocation定位

题记:本人之前做过定位地图,由于公司长时间没有此方面的业务,最近有人询问相关的知识,竟然一点不记得。特写此笔记,方便朋友和自己随时查看。

苹果的定位分为iOS8.0-(8.0之前)和iOS8.0+(8.0之后)

iOS8.0之前的,楼主不在赘述,有需要的朋友,联系楼主。


创建步骤如下:

1.创建好工程,导入定位的头文件

#import

2.创建 定位管理者对象 CLLocationManager

/** 定位对象 */
@property(nonatomic,strong) CLLocationManager * locationManager;

3.初始化 定位管理者 locationManager,并判断是否开启了定位服务

//定位管理器
 _locationManager=[[CLLocationManager alloc]init];
//  判断定位服务是否开启
if (![CLLocationManager locationServicesEnabled]) {
        NSLog(@"定位服务当前可能尚未打开,请设置打开!");
        return;
    }

一般locationServicesEnabled定位服务是打开的,因为手机上其他app会调用定位服务

4.查看用户是否授权定位服务

/**
 * authorizationStatus:返回当前授权调用应用程序的状态
 * kCLAuthorizationStatusNotDetermined:用户还没有关于这个应用程序做出了选择

*/
if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusNotDetermined){
        [_locationManager requestAlwaysAuthorization];
    }else if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedWhenInUse){
        //设置代理
        self.locationManager.delegate=self;
        //设置定位精度
        _locationManager.desiredAccuracy=kCLLocationAccuracyBest;
        //定位频率,每隔多少米定位一次
        CLLocationDistance distance=10.0;//十米定位一次
        _locationManager.distanceFilter=distance;
        //启动跟踪定位
        [_locationManager startUpdatingLocation];
    }
4.1用户定位的授权状态是kCLAuthorizationStatusNotDetermined,即用户还没有关于应用程序做出选择,则需要重新请求权限

授权有两种方式

//  前后台定位授权
[_locationManager requestAlwaysAuthorization];

//  前台定位授权
[_locationManager requestWhenInUseAuthorization];

两种授权都需要在info.plist文件里面设置

--requestAlwaysAuthorization设置

注意:
iOS11之前持续定位在info.plist文件中添加的是Privacy - Location Always Usage Description,并且iOS11中在询问用户定位权限时,使用requestAlwaysAuthorization属性,用户点击的是“app使用期间使用”,则系统会选择成 使用期间使用定位功能

79C049F2-CAAF-47B5-BC46-7AB6E113CDB6.png

--requestWhenInUseAuthorization设置

341B76BF-2C27-4E13-BA9D-D34A503AB722.png

前台定位,退到后台不定位,要是想使用后台定位需要设置

5.设置代理并遵守协议

@interface ViewController ()
self.locationManager.delegate=self;

6.实现代理方法

#pragma mark - CoreLocation 代理
#pragma mark 跟踪定位代理方法,每次位置发生变化即会执行(只要定位到相应位置)
//可以通过模拟器设置一个虚拟位置,否则在模拟器中无法调用此方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    CLLocation *location=[locations firstObject];//取出第一个位置
    CLLocationCoordinate2D coordinate=location.coordinate;//位置坐标
    NSLog(@"经度:%f,纬度:%f,海拔:%f,航向:%f,行走速度:%f",coordinate.longitude,coordinate.latitude,location.altitude,location.course,location.speed);
    //如果不需要实时定位,使用完即使关闭定位服务
    [_locationManager stopUpdatingLocation];
}

注意:

如果app需要后台定位则必须添加一句代码

//  后台定位功能
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    self.locationManager.allowsBackgroundLocationUpdates = YES;
   }

如果选择的是[_locationManager requestWhenInUseAuthorization];(允许前台定位),则还需要打开一个设置 Location updates属性

AA6B2388-9545-4152-B409-0BF65FE507F9.png


个人疑惑:self.locationManager.allowsBackgroundLocationUpdates = YES;官方给的解释是不针对iOS9.0或者更高版本,但是不添加这句话,不能实现后台定位,有大神知道,麻烦大神给留言说一声,感激不尽。

AEFBBC12-6F28-4CDF-A12E-4EE16D8C64AE.png

ps:更详细的请点击链接http://www.cnblogs.com/kenshincui/p/4125570.html崔哥的博客。

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