iOS中用CoreLocation实现定位

2017-08-04  本文已影响16人  JohnayXiao
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController ()<CLLocationManagerDelegate>

//必须把CLLocationManger声明属性
@property (nonatomic, strong) CLLocationManager *mgr;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //1.初始化manager对象
    self.mgr = [CLLocationManager new];
    //2.询问/征求用户定义允许(iOS8+)
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        //需要用户的同意(仅仅是在使用期间/前台)+Info.plist添加key
        [self.mgr requestWhenInUseAuthorization];
        //征求前台和后台都定位+Info.plist添加key
//        [self.mgr requestAlwaysAuthorization];
    } else {
        //直接定位
        [self.mgr startUpdatingLocation];
    }
    //3.设置代理
    self.mgr.delegate = self;
}

//监听用户的状态(同意/不同意)
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    if (status == kCLAuthorizationStatusAuthorizedWhenInUse) {
        //用户同意前台定位; 开始定位(开始更新位置)
        //系统默认每一秒发送一次请求(不能改)
        //定位的精确度(默认精度是最高精度/耗电;其他的设置相对不耗电)
        self.mgr.desiredAccuracy = kCLLocationAccuracyHundredMeters;
        //位置的更新频率(减少didUpdateLocations方法的调用;模拟器没有什么用处)
        self.mgr.distanceFilter = 10000;//单位:米
//        [self.mgr startUpdatingLocation];
        //V2:保证只发送一次请求(模拟器不靠谱)
        [self.mgr requestLocation];
    } else if (status == kCLAuthorizationStatusDenied) {
        //用户没有同意定位
        NSLog(@"用户不同意定位....");
    }
}
//[self.mgr startUpdatingLocation];
//监听用户的位置触发下面的方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    //获取用户的最新位置(数组的最后一个对象)
    CLLocation *location = [locations lastObject];
    NSLog(@"纬度%f; 经度%f", location.coordinate.latitude, location.coordinate.longitude);
    //调用停止定位服务(不会再触发这个方法)
    [self.mgr stopUpdatingLocation];
    //设置mgr为nil,一定只调用一次
//    self.mgr = nil;//因为调用requestLocation方法
    
}
//失败获取用户的位置
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSLog(@"服务器返回失败:%@", error);
}

@end
上一篇下一篇

猜你喜欢

热点阅读