2014-07-18 14 views
5

ja rozwiązać problem, że usługi GPS działa doskonale na iOS 7, ale na iOS 8 nigdy nie otrzymuję prośbę o pozwolenie i metody:iOS 8 GPS nie włączone

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

nigdy nie jest wywoływana.

Mój kod jest tutaj:

#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 

Ja również sprawdzone pod ustawieniach lokalizacji i nic za moim imieniu aplikacji. Inne aplikacje mają ("Zawsze", "Nigdy" lub "Podczas korzystania").

Odpowiedz

11

Dla IOS 8 należy dodać do swojego plista klucz NSLocationAlwaysUsageDescription lub NSLocationWhenInUseUsageDescription. W przeciwnym razie nie prosi o pozwolenie.

dodać CLLocationManagerDelegate

@implementation Locator <CLLocationManagerDelegate> 

- (instancetype) init { 
    //...... 
    self.locationManager.requestAlwaysAuthorization(); 
} 
+0

Można również zadzwonić requestWhenInUseAuthorization i dodać NSLocationWhenInUseUsageDescription wam PLIST jeśli potrzebujesz dostępu do LocationManager tylko wtedy, gdy aplikacja jest uruchomiona (nie w tle). –