CoreLocation - Access User Location

492 阅读1分钟

CoreLocation - Access User Location

Update Info.plist

Add descriptions for those keys:

  • Privacy - Location Always Usage Description
  • Privacy - Location When In Use Usage Description
  • Privacy - Location Always and When In Use Usage Description

Info.plist

Import CoreLocation.h

#import <CoreLocation/CoreLocation.h>


@interface ViewController() <CLLocationManagerDelegate>

@property (nonatomic, strong) CLLocationManager *locationManager;

@end

Init Configuration

#pragma mark - Configuration

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self configLocationService];
}

- (void)configLocationService {
    if ([CLLocationManager locationServicesEnabled]) {
        self.locationManager = [[CLLocationManager alloc] init];
        
        /// config desired accuracy
        [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
        [self.locationManager setDistanceFilter:100.f];
        self.locationManager.delegate = self;
        
        /// start locating
        [self.locationManager startUpdatingLocation];
    } else {
        NSString *message = @"System location service not enabled, manually open in Settings - Privacy";
        UIAlertController *alertVC =
            [UIAlertController alertControllerWithTitle:@"Tip"
                                                message:message
                                         preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *action = [UIAlertAction actionWithTitle:@"Got it" style:UIAlertActionStyleCancel handler:nil];
        [alertVC addAction:action];
        
        [self presentViewController:alertVC animated:YES completion:nil];
    }
}

Conform to CLLocationManagerDelegate

#pragma mark - CLLocationManagerDelegate

- (void)locationManagerDidChangeAuthorization:(CLLocationManager *)manager {
    switch (manager.authorizationStatus) {
        case kCLAuthorizationStatusNotDetermined: {
            NSLog(@"[CoreLocation] CLAuthorizationStatus: NotDetermined");
            [self.locationManager requestWhenInUseAuthorization];
            break;
        }
        case kCLAuthorizationStatusRestricted: {
            NSLog(@"[CoreLocation] CLAuthorizationStatus: Restricted");
            [self.locationManager requestWhenInUseAuthorization];
            break;
        }
        case kCLAuthorizationStatusDenied: {
            NSLog(@"[CoreLocation] CLAuthorizationStatus: Denied");
            break;
        }
        case kCLAuthorizationStatusAuthorizedAlways:{
            NSLog(@"[CoreLocation] CLAuthorizationStatus: AuthorizedAlways");
            break;
        }
        case kCLAuthorizationStatusAuthorizedWhenInUse:{
            NSLog(@"[CoreLocation] CLAuthorizationStatus: AuthorizedWhenInUse");
            break;
        }
        default:
            break;
    }
}

-  (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    CLLocation *location = [locations lastObject];
    
    if (location.horizontalAccuracy < 0) {
        UIAlertController * alertVC =
            [UIAlertController alertControllerWithTitle:@"Tip"
                                                message:@"Locating failed, check your iPhone's status"
                                         preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *action = [UIAlertAction actionWithTitle:@"Got it" style:UIAlertActionStyleCancel handler:nil];
        [alertVC addAction:action];
        
        [self presentViewController:alertVC animated:YES completion:nil];
    } else {
        CLLocationCoordinate2D coor2D = location.coordinate;
        CLLocationDistance altitude = location.altitude;
        NSLog(@"[CoreLocation] latitude: %f, longitude: %f, altitude: %f", coor2D.latitude, coor2D.longitude, altitude);
        
        CLLocationAccuracy horizontalAcc = location.horizontalAccuracy;
        CLLocationAccuracy verticalAcc = location.verticalAccuracy;
        NSLog(@"[CoreLocation] horizontalAccuracy: %f, verticalAccuracy: %f", horizontalAcc, verticalAcc);
        
        /// stop locating
        [self.locationManager stopUpdatingLocation];
    }
}

Console Output and Demo

2021-11-11 01:25:22.590668+0800 LocationDemo[36155:7046077] [CoreLocation] CLAuthorizationStatus: AuthorizedWhenInUse

2021-11-11 01:25:22.593283+0800 LocationDemo[36155:7046077] [CoreLocation] latitude: 40.089388, longitude: 116.540353, altitude: 34.824875

2021-11-11 01:25:22.593393+0800 LocationDemo[36155:7046077] [CoreLocation] horizontalAccuracy: 35.000000, verticalAccuracy: 13.980997

Demo