Pregunta Los servicios de ubicación no funcionan en iOS 8


Mi aplicación que funcionó bien en iOS 7 no funciona con iOS 8 SDK.

CLLocationManager no devuelve una ubicación, y no veo mi aplicación en Configuraciones -> Servicios de localización ya sea. Hice una búsqueda en Google sobre el tema, pero no salió nada. ¿Qué podría estar mal?


602
2018-06-05 14:12


origen


Respuestas:


Terminé resolviendo mi propio problema.

Aparentemente en iOS 8 SDK, requestAlwaysAuthorization (para la ubicación de fondo) o requestWhenInUseAuthorization (ubicación solo en primer plano) llamada en CLLocationManager es necesario antes de comenzar las actualizaciones de ubicación.

También necesita ser NSLocationAlwaysUsageDescription o NSLocationWhenInUseUsageDescription teclear Info.plist con un mensaje que se mostrará en el aviso. Agregar estos resolvió mi problema.

enter image description here

Espero que ayude a alguien más.

EDITAR: para obtener más información, echa un vistazo a: Core-Location-Manager-Changes-in-ios-8


1083
2018-06-05 14:58



Me estaba tirando de los pelos con el mismo problema. Xcode te da el error:

Intentando comenzar MapKit actualizaciones de ubicación sin solicitar   autorización de ubicación Debe llamar -[CLLocationManager requestWhenInUseAuthorization] o -[CLLocationManager requestAlwaysAuthorization] primero.

Pero incluso si implementa uno de los métodos anteriores, no le preguntará al usuario a menos que haya una entrada en el info.plist para NSLocationAlwaysUsageDescription o NSLocationWhenInUseUsageDescription.

Agregue las siguientes líneas a su info.plist donde los valores de cadena representan la razón por la que necesita acceder a la ubicación de los usuarios

<key>NSLocationWhenInUseUsageDescription</key>
<string>This application requires location services to work</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>This application requires location services to work</string>

Creo que estas entradas pueden haber faltado desde que comencé este proyecto en Xcode 5. Supongo que Xcode 6 podría agregar entradas predeterminadas para estas claves, pero no las ha confirmado.

Puede encontrar más información sobre estas dos configuraciones aquí 


312
2018-06-05 15:58



Para garantizar que esto sea compatible con iOS 7, debe verificar si el usuario ejecuta iOS 8 o iOS 7. Por ejemplo:

#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

//In ViewDidLoad
if(IS_OS_8_OR_LATER) {
   [self.locationManager requestAlwaysAuthorization];
}

[self.locationManager startUpdatingLocation];

103
2018-06-27 01:14



- (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


}

Y a su archivo info.plist enter image description here


50
2017-09-30 10:24



De acuerdo con los documentos de Apple:

A partir de iOS 8, la presencia de un NSLocationWhenInUseUsageDescription o una NSLocationAlwaysUsageDescription se requiere el valor clave en el archivo Info.plist de su aplicación. También es necesario solicitar permiso al usuario antes de registrarse para actualizaciones de ubicación, ya sea llamando [self.myLocationManager requestWhenInUseAuthorization] o [self.myLocationManager requestAlwaysAuthorization] dependiendo de tu necesidad La cadena que ingresó en Info.plist se mostrará en el siguiente diálogo.

Si el usuario otorga el permiso, es un negocio como siempre. Si niegan el permiso, entonces el delegado no es informado de las actualizaciones de ubicación.


30
2018-06-08 22:16



- (void)viewDidLoad
{

    [super viewDidLoad];
    self.locationManager = [[CLLocationManager alloc] init];

    self.locationManager.delegate = self;
    if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]){
        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");
            }
        }
    }
    [self.locationManager startUpdatingLocation];
}

>  #pragma mark - CLLocationManagerDelegate

    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
    {
        NSLog(@"didFailWithError: %@", error);
        UIAlertView *errorAlert = [[UIAlertView alloc]
                                   initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [errorAlert show];
    }

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {
        NSLog(@"didUpdateToLocation: %@", newLocation);
        CLLocation *currentLocation = newLocation;

        if (currentLocation != nil) {
            longitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
            latitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
        }
    }

En iOS 8 necesita hacer dos cosas adicionales para que la ubicación funcione: Agregar   una clave para su Info.plist y solicitar autorización de la ubicación   gerente pidiendo que comience. Hay dos claves Info.plist para el nuevo   autorización de ubicación Se requiere una o ambas de estas claves. Si   ninguna de las claves está ahí, puede llamar a startUpdatingLocation pero   el administrador de la ubicación en realidad no comenzará. No enviará una falla   mensaje al delegado tampoco (ya que nunca comenzó, no puede   fallar). También fallará si agrega una o ambas teclas pero olvida   para solicitar explícitamente la autorización. Entonces, lo primero que debes hacer   es agregar una o ambas de las siguientes claves a su archivo Info.plist:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

Ambas teclas toman una cadena

que es una descripción de por qué necesita servicios de ubicación. Usted puede   ingrese una cadena como "Se requiere una ubicación para averiguar dónde se encuentra"   que, como en iOS 7, se puede localizar en el archivo InfoPlist.strings.

enter image description here 


28
2017-12-17 03:26



Mi solución que se puede compilar en 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];

19
2017-09-24 12:13