Location Services not working in iOS 8

前端 未结 26 1985
滥情空心
滥情空心 2020-11-21 10:23

My app that worked fine on iOS 7 doesn\'t work with the iOS 8 SDK.

CLLocationManager doesn\'t return a location, and I don\'t see my app under

相关标签:
26条回答
  • 2020-11-21 10:26
    - (void)startLocationManager
    {
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        locationManager.distanceFilter = kCLDistanceFilterNone; //whenever we move
        locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    
        [locationManager startUpdatingLocation];
        [locationManager requestWhenInUseAuthorization]; // Add This Line
    
    
    }
    

    And to your info.plist File enter image description here

    0 讨论(0)
  • 2020-11-21 10:26

    My solution which can be compiled in Xcode 5:

    #ifdef __IPHONE_8_0
        NSUInteger code = [CLLocationManager authorizationStatus];
        if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) {
            // choose one request according to your business.
            if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){
                [self.locationManager requestAlwaysAuthorization];
            } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) {
                [self.locationManager  requestWhenInUseAuthorization];
            } else {
                NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription");
            }
        }
    #endif
        [self.locationManager startUpdatingLocation];
    
    0 讨论(0)
  • 2020-11-21 10:26

    In iOS 8 you need to do two extra things to get location working: Add a key to your Info.plist and request authorization from the location manager asking it to start

    info.plist:

    <key>NSLocationUsageDescription</key>
    <string>I need location</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>I need location</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>I need location</string>
    

    Add this to your code

    if (IS_OS_8_OR_LATER)
    {
        [locationmanager requestWhenInUseAuthorization];
    
        [locationmanager requestAlwaysAuthorization];
    }
    
    0 讨论(0)
  • 2020-11-21 10:26

    Solution with backward compatibility which doesn't produce Xcode warnings:

    SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
    if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
      [self.locationManager respondsToSelector:requestSelector]) {
    ((void (*)(id, SEL))[self.locationManager methodForSelector:requestSelector])(self.locationManager, requestSelector);
      [self.locationManager startUpdatingLocation];
    } else {
      [self.locationManager startUpdatingLocation];
    }
    

    Setup NSLocationWhenInUseUsageDescription key in your Info.plist.

    For iOS version 11.0+ : Setup NSLocationAlwaysAndWhenInUseUsageDescription key in your Info.plist. along with other 2 keys.

    0 讨论(0)
  • 2020-11-21 10:26

    The problem for me was that the class that was the CLLocationManagerDelegate was private, which prevented all the delegate methods from being called. Guess it's not a very common situation but thought I'd mention it in case t helps anyone.

    0 讨论(0)
  • 2020-11-21 10:30

    The old code for asking location won't work in iOS 8. You can try this method for location authorization:

    - (void)requestAlwaysAuthorization
    {
        CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
    
        // If the status is denied or only granted for when in use, display an alert
        if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status ==        kCLAuthorizationStatusDenied) {
            NSString *title;
            title = (status == kCLAuthorizationStatusDenied) ? @"Location services are off" :   @"Background location is not enabled";
            NSString *message = @"To use background location you must turn on 'Always' in the Location Services Settings";
    
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
                                                                message:message
                                                               delegate:self
                                                      cancelButtonTitle:@"Cancel"
                                                      otherButtonTitles:@"Settings", nil];
            [alertView show];
        }
        // The user has not enabled any location services. Request background authorization.
        else if (status == kCLAuthorizationStatusNotDetermined) {
            [self.locationManager requestAlwaysAuthorization];
        }
    }
    
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
        if (buttonIndex == 1) {
            // Send the user to the Settings for this app
            NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
            [[UIApplication sharedApplication] openURL:settingsURL];
        }
    }
    
    0 讨论(0)
提交回复
热议问题