Location
// // ViewController.m // CoreLoaction // // Created by on 2016/10/26. // Copyright © 2016年 xiezefeng. All rights reserved. // #import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewController ()<CLLocationManagerDelegate> @property (weak, nonatomic) IBOutlet UIImageView *myImageView; @property (weak, nonatomic) IBOutlet UILabel *cipianjiao; @property (weak, nonatomic) IBOutlet UILabel *detailText; @property (weak, nonatomic) IBOutlet UILabel *state; @property(nonatomic,strong) CLLocationManager * lm; @property(nonatomic,strong)CLLocation * oldLocation; @property (weak, nonatomic) IBOutlet UILabel *zouwei; @end @implementation ViewController - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{ NSLog(@"error.description %@",error.description); } -(CLLocationManager *)lm { // [_lm requestLocation]; if (!_lm) { //创建位置管理者 _lm=[[CLLocationManager alloc]init]; _lm.delegate = self; if ([[UIDevice currentDevice].systemVersion floatValue]>=8.0) { //ios 8 请求用户授权 // [self.lm requestWhenInUseAuthorization];//前台 [self.lm requestAlwaysAuthorization];//前后台 } // if ([_lm respondsToSelector:@selector(requestWhenInUseAuthorization)]) { // //ios 8 请求用户授权 //// [self.lm requestWhenInUseAuthorization];//前台 // [self.lm requestAlwaysAuthorization];//前后台 // } if ([_lm respondsToSelector:@selector(allowsBackgroundLocationUpdates)]) { //ios9 //允许后台定位 一定要够炫后台location updates self.lm.allowsBackgroundLocationUpdates= YES; } // _lm.distanceFilter = 100;//每隔多少米定位一次 _lm.desiredAccuracy = kCLLocationAccuracyBestForNavigation;//最好 jing } return _lm; } //授权状态发生改变导用 状态 -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{ switch (status) { case kCLAuthorizationStatusNotDetermined: { _state.text=@"用户还没决定"; } break; case kCLAuthorizationStatusRestricted:{ _state.text=@"访问受限"; } case kCLAuthorizationStatusDenied: { if ([CLLocationManager locationServicesEnabled]) { NSLog(@"定位开启,但被拒"); }else{ _state.text=@"定位关闭,不可用"; } _state.text=@"用户还没决定"; break; } case kCLAuthorizationStatusAuthorizedAlways:{ _state.text=@"获得前后台定位授权"; } break; case kCLAuthorizationStatusAuthorizedWhenInUse:{ NSLog(@"获得前台定位授权"); _state.text=@"获得前台定位授权"; } default: break; } } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //更新用户位置 //默认前台 [self.lm startUpdatingLocation]; //手机方向变化监听 [self.lm startUpdatingHeading]; //区域监听 CLLocationCoordinate2D loact = CLLocationCoordinate2DMake(23.121481, 113.322436); CLCircularRegion * region =[[CLCircularRegion alloc]initWithCenter:loact radius:10000000 identifier:@"ident"]; [self.lm requestAlwaysAuthorization]; [self.lm startMonitoringForRegion:region]; [self.lm requestStateForRegion:region]; } -(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(nonnull CLRegion *)region { } /** * 监听区域失败时调用 * * @param manager 位置管理者 * @param region 区域 * @param error 错误 */ -(void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error { // 经验: 一般在这里, 做移除最远的区域 // [manager stopMonitoringForRegion:@"最÷远区域"]; } //进入区域触发代理 -(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{ NSLog(@"进入区域"); UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"进入区域" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"ok", nil]; [alert show]; } -(void)locationManager:(CLLocationManager *)manager didExitRegion:(nonnull CLRegion *)region{ UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"离开区域" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"ok", nil]; [alert show]; NSLog(@"离开区域"); } - (void)viewDidLoad { [super viewDidLoad]; CLGeocoder * geoc = [CLGeocoder new]; // [geoc geocodeAddressString:@"广州" completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) { // // CLPlacemark * pm = placemarks[0]; // NSLog(@"%@",pm.name); // }]; // return; //地理反编码 CLLocation * locationt = [[CLLocation alloc]initWithLatitude:23.122392 longitude:113.319210]; [geoc reverseGeocodeLocation:locationt completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) { CLPlacemark * pm = placemarks[0]; NSLog(@"%@",pm.name); }]; self.view.backgroundColor = [UIColor orangeColor]; //停止定位 // [self.lm stopUpdatingLocation]; // Do any additional setup after loading the view, typically from a nib. } -(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{ //磁偏角 _cipianjiao.text = [NSString stringWithFormat:@"%f", newHeading.trueHeading]; CGFloat angle = newHeading.trueHeading; CGFloat angler =angle/100.0*M_PI; [UIView animateWithDuration:0.5 animations:^{ _myImageView.transform = CGAffineTransformMakeRotation(-angler); }]; } #pragma mark CLLocationManagerDelegate //更新到位置之后调用 int a; //locations 位置数组 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{ CLLocation * location = locations.lastObject; NSLog(@"定位中%f %f %f",location.coordinate.latitude,location.coordinate.longitude,location.altitude); CLLocation * locationt = [[CLLocation alloc]initWithLatitude:23.122392 longitude:113.319210]; NSString * angleStr = nil; if (!_oldLocation) { _oldLocation = location; } switch ((int)_oldLocation.course/90) { case 0: angleStr = @"北偏东"; break; case 1: angleStr = @"东偏北"; break; case 2: angleStr = @"南偏西"; break; case 3: angleStr = @"西偏北"; break; default: angleStr = @"去哪了"; break; } if ((int)location%90==0) { NSRange range = NSMakeRange(0, 1); angleStr = [NSString stringWithFormat:@"正%@",[angleStr substringWithRange:(range)]]; } _zouwei.text = angleStr; //偏移角度 NSInteger angle = 0; angle =(int)location.course%90; //移动多少米 NSLog(@"========%f", [location distanceFromLocation:locationt]); _detailText.text = [NSString stringWithFormat:@"定位中%ld",(long)a++]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end