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