Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS 8 gps not enabled

I tackled an issue, that GPS services work perfectly on iOS 7, but on iOS 8 I never get the permission request and the method:

- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

never gets called.

My code is here:

#import "Locator.h"

@implementation Locator

- (instancetype) init {
    if (self = [super init]) {
        // Start up the location manager
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        self.locationManager.distanceFilter = 3;
        // New property for iOS6
        if ([self.locationManager respondsToSelector:@selector(activityType)]) {
            self.locationManager.activityType = CLActivityTypeFitness;
        }
        // New method for iOS8
        if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
            [self.locationManager requestAlwaysAuthorization];
        }
    }
    return self;
}

- (void) startMonitoring:(LocationChangeCallback)callback {
    if ([CLLocationManager locationServicesEnabled] && [CLLocationManager significantLocationChangeMonitoringAvailable]) {
        // Register an observer for if/when this app goes into background & comes back to foreground
        // NOTE: THIS CODE IS iOS4.0+ ONLY.
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(switchToLowEnergyMode) name:UIApplicationDidEnterBackgroundNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(switchToAccurateMode) name:UIApplicationDidFinishLaunchingNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(switchToAccurateMode) name:UIApplicationWillEnterForegroundNotification object:nil];

        UIApplicationState state = [[UIApplication sharedApplication] applicationState];

        self.locationUpdateCallback = callback;

        if (state == UIApplicationStateActive) {
            [self switchToAccurateMode];
        } else {
            [self switchToLowEnergyMode];
        }
    }
}

- (void) switchToAccurateMode {
    NSLog(@"Accurate");
    [self.locationManager stopMonitoringSignificantLocationChanges];

    // Find the current location
    [self.locationManager startUpdatingLocation];
}

- (void) switchToLowEnergyMode {
    NSLog(@"Low Energy");
    [self.locationManager stopUpdatingLocation];

    // Find the current location
    [self.locationManager startMonitoringSignificantLocationChanges];
}


#pragma mark - CLLocationDelegate Methods

- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    // locations contains an array of recent locations, but this app only cares about the most recent
    // which is also "manager.location"
    if (self.locationUpdateCallback != nil) {
        self.locationUpdateCallback(manager.location);
    }
}

- (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSLog(@"Location manager failed with error: %@", error);
    if ([error.domain isEqualToString:kCLErrorDomain] && error.code == kCLErrorDenied) {
        //user denied location services so stop updating manager
        [manager stopUpdatingLocation];
    }
}
@end

I also checked under location settings and there was nothing behind my application name. Other applications have ("Always", "Never" or "While Using").

like image 714
user365314 Avatar asked Jul 18 '14 09:07

user365314


1 Answers

For IOS 8 you have to add NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription key to your plist. Otherwise it does not ask for permission.

add CLLocationManagerDelegate

@implementation Locator <CLLocationManagerDelegate>

- (instancetype) init {
    //......
    self.locationManager.requestAlwaysAuthorization();
}
like image 103
modus Avatar answered Sep 20 '22 22:09

modus