首页 > 代码库 > Location

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

 

Location