iOS 8 GPS 未启用

Posted

技术标签:

【中文标题】iOS 8 GPS 未启用【英文标题】:iOS 8 gps not enabled 【发布时间】:2014-07-18 09:03:58 【问题描述】:

我解决了一个问题,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】:

对于 IOS 8,您必须将 NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription 密钥添加到您的 plist。否则它不会请求许可。

添加 CLLocationManagerDelegate

@implementation Locator <CLLocationManagerDelegate>

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

【讨论】:

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

以上是关于iOS 8 GPS 未启用的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式启用 gps 的问题

提示后检查用户是不是启用了 GPS

启用 GPS 定位后,AlertDialog 没有被禁用

明确识别是不是在后台启用了android服务位置和gps

Ionic3 GPS 启用

如何检测在 iOS 8 上包含应用程序时启用了应用程序扩展?