iOS 8 GPS未启用。

5

我遇到了一个问题,即GPS服务在iOS 7上可以完美地工作,但在iOS 8上却从未收到权限请求,也无法使用以下方法:

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

从未被调用。

我的代码在这里:

#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

我还在位置设置下检查了一下,但我的应用名称后面没有任何内容。其他应用程序都有(“始终”,“从不”或“使用时”)。

1个回答

11

对于 iOS 8,您需要将 NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription 键添加到您的 plist 中。否则,它不会请求权限。

添加 CLLocationManagerDelegate。

@implementation Locator <CLLocationManagerDelegate>

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

如果您只需要在应用程序运行时(而不是在后台)访问LocationManager,则还可以调用requestWhenInUseAuthorization并将NSLocationWhenInUseUsageDescription添加到您的plist中。 - Andreas Paulsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接