2014-07-18 30 views
5

etkin değil ama iOS 8 Ben izin isteği ve yöntemi asla:iOS 8 gps, o GPS hizmetlerini iOS 7'de mükemmel çalışmasını Ben bir sorunu ele

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

asla çağrılır.

Kodum burada:

#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 

Ben de konum ayarları altında kontrol ve başvurum isminin arkasında hiçbir şey yoktu. Diğer uygulamalar ("Her zaman", "Asla" veya "Kullanırken") var.

cevap

11

IOS 8 için plistinize NSLocationAlwaysUsageDescription veya NSLocationWhenInUseUsageDescription anahtarını eklemeniz gerekir. Aksi halde izin istemez.

CLLocationManagerDelegate

@implementation Locator <CLLocationManagerDelegate> 

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

uygulama (değil arka planda) çalışırken sadece LocationManager erişmeleri gerekiyorsa da PLIST requestWhenInUseAuthorization arayıp size NSLocationWhenInUseUsageDescription ekleyebilir ekleyin. –