Checking location service permission on iOS

前端 未结 8 1780
有刺的猬
有刺的猬 2020-12-07 12:32

How can I check if location service is enabled for my app?

I have 2 storyboards and I want to check location service. If location service enabled for my app, I want

相关标签:
8条回答
  • 2020-12-07 12:58

    Check CLLocationManager's locationServicesEnabled property to check the system-wide availability. Use your CLLocationManagerDelegate's locationManager: didFailWithError: method and check for a kCLErrorDenied error to see if the user denied location services.

    BOOL locationAllowed = [CLLocationManager locationServicesEnabled];
     if (!locationAllowed) 
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Location Service Disabled" 
                                                            message:@"To re-enable, please go to Settings and turn on Location Service for this app." 
                                                           delegate:nil 
                                                  cancelButtonTitle:@"OK" 
                                                  otherButtonTitles:nil];
            [alert show];
            [alert release];
    }
    

    for your app use this code

    - (void)viewDidLoad
    {
        locationManager = [[CLLocationManager alloc] init];
    
        locationManager.delegate = self;
    
        locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    
        // Set a movement threshold for new events.
    
        locationManager.distanceFilter = 500;
    
        [locationManager startUpdatingLocation];
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    - (void)locationManager:(CLLocationManager *)manager
    
         didUpdateLocations:(NSArray *)locations {
    
        // If it's a relatively recent event, turn off updates to save power
    
    }
    
    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
    {
    
        NSLog(@"%@",error);
    }
    

    if location service disable for your app then its give you error

    Error Domain=kCLErrorDomain Code=1 "The operation couldn’t be completed. (kCLErrorDomain error 1.)"
    
    0 讨论(0)
  • 2020-12-07 13:02

    After a lot of investigation. I would recommend to display this message on a label and not on an alert view. because, there are a lot of cases to test against(user disables location service in general or just for app. delete app, reinstall).

    One of these cases causes your alert to show your message along with apple's alert message at the same time. your alert will be behind apple's alert. which is a confusing and un-logical behavior.

    I recommend the following:

    Swift 3:

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    
        switch status {
            case .notDetermined:
                Log.verbose("User still thinking granting location access!")
                manager.startUpdatingLocation() // this will access location automatically if user granted access manually. and will not show apple's request alert twice. (Tested)
            break
    
            case .denied:
                Log.verbose("User denied location access request!!")
                // show text on label
                label.text = "To re-enable, please go to Settings and turn on Location Service for this app."
    
                manager.stopUpdatingLocation()
                loadingView.stopLoading()
            break
    
            case .authorizedWhenInUse:
                // clear text
                label.text = ""
                manager.startUpdatingLocation() //Will update location immediately
            break
    
            case .authorizedAlways:
                // clear text
                label.text = ""
                manager.startUpdatingLocation() //Will update location immediately
            break
            default:
                break
        }
    }
    

    Objective-C:

    - (void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
        switch (status) {
            case kCLAuthorizationStatusNotDetermined: {
                DDLogVerbose(@"User still thinking granting location access!");
                [locationManager startUpdatingLocation]; // this will access location automatically if user granted access manually. and will not show apple's request alert twice. (Tested)
            } break;
            case kCLAuthorizationStatusDenied: {
                DDLogVerbose(@"User denied location access request!!");
                // show text on label
                label.text = @"To re-enable, please go to Settings and turn on Location Service for this app.";
    
                [locationManager stopUpdatingLocation];
                [loadingView stopLoading];
            } break;
            case kCLAuthorizationStatusAuthorizedWhenInUse:
            case kCLAuthorizationStatusAuthorizedAlways: {
                // clear text
                label.text = @"";
                [locationManager startUpdatingLocation]; //Will update location immediately
            } break;
            default:
                break;
        }
    }
    
    0 讨论(0)
提交回复
热议问题