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
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