Los servicios de ubicación no funcionan en iOS 11

Acabo de reconstruir mi aplicación con iOS 11 SDK en un bash de eliminar el blue banner que ahora siempre está apareciendo. Pensé: “Genial, eso funcionó”, solo para descubrir que los servicios de localización ya no funcionan en absoluto.

La aplicación solía funcionar con iOS 10 – ¿Alguien ha escuchado algo?

Parece que Apple ha agregado otra característica de privacidad. El usuario ahora puede anular nuestra requestAlwaysAuthorization y degradarla para requestWhenInUseAuthorization – Lo que significa que como desarrollador tenemos que proporcionar ambas descripciones en Info.plist

Descubrí que han agregado una nueva clave NSLocationAlwaysAndWhenInUseUsageDescription

 /* * Either the NSLocationAlwaysAndWhenInUseUsageDescription key or both the * NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription * keys must be specified in your Info.plist; otherwise, this method will do * nothing, as your app will be assumed not to support Always authorization. */ 

Sin embargo, al utilizar esta nueva clave, el servicio de ubicación aún no funcionaba, al realizar una búsqueda más profunda encontré esta gem mezclada con toda la información adicional de depuración:

Esta aplicación ha intentado acceder a datos confidenciales sin una descripción de uso. El Info.plist de la aplicación debe contener las claves NSLocationAlwaysAndWhenInUseUsageDescription y NSLocationWhenInUseUsageDescription con valores de cadena que expliquen al usuario cómo utiliza la aplicación esta información.

Lo cual contradice directamente el comentario que encontré en el archivo CLLocationManager.h actualizado. Así que creé un radar.

Buenas noticias, si sigues los consejos de la consola de depuración, IE. agregue la nueva clave NSLocationAlwaysAndWhenInUseUsageDescription y una de las claves antiguas NSLocationWhenInUseUsageDescription , los servicios de ubicaciones comenzarán a funcionar nuevamente.

Solo para agregar los pasos para solucionar esto:

2 formas de hacerlo:

A) La manera más fácil: seleccione su archivo Info.plist, agregue las propiedades, tenga en cuenta que comienzan con PRIVCY en lugar de LOCATION … por lo tanto, los nombres exactos de estas variables comienzan con “Privacidad – Ubicación …” etc., agregue cada uno aquí, y describe cómo el usuario estaría viendo esto en la advertencia.

B) La forma difícil / interesante / programática (me gusta así más):

Haga clic derecho en su Info.plist para su aplicación, y luego seleccione “Ver código fuente”, debería verlo todo en XML,

Siga el otro … formato y agregue estas propiedades de la siguiente manera:

 NSLocationAlwaysUsageDescription Program requires GPS to track cars and job orders NSLocationAlwaysAndWhenInUseUsageDescription Program requires GPS to track cars and job orders NSLocationWhenInUseUsageDescription Program requires GPS to track cars and job orders NSMicrophoneUsageDescription This app uses your Microphone to allow Voice over IP communication with the Program Admin system 

Guarde, y luego haga clic derecho en el archivo info.plist, y luego seleccione Lista de propiedades, esto debería ver el archivo nuevamente en la vista predeterminada.

EDITAR:

Otro miembro pidió código, aquí está:

1) En su archivo .H, agregue:

 @property (strong, nonatomic) CLLocationManager *LocationManager; 

2) En su archivo .M agréguelo bajo la función ViewDidAppear ():

 _LocationManager = [[CLLocationManager alloc] init]; [_LocationManager setDelegate:self]; _LocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; _LocationManager.pausesLocationUpdatesAutomatically = NO; [_LocationManager requestAlwaysAuthorization]; _LocationManager.headingFilter = 5; _LocationManager.distanceFilter = 0; [_LocationManager startUpdatingLocation]; [_LocationManager startUpdatingHeading]; 

Esto funciona bien para mí, espero que el código también funcione para usted.

Saludos

Heider

trabajando bajo iOS11 descubrí que Info.plist necesita al menos NSLocationAlwaysAndWhenInUseUsageDescription en Info.plist:

enter image description here

Es bastante extraño que cuando su aplicación sea multilingüe, las versiones localizadas de sus cadenas necesiten las tres claves mencionadas en esta publicación, más requestAlwaysAuthorization() y locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) fallarán en silencio.

Tiro que muestra la traducción alemana como ejemplo:

enter image description here

Espero que esto te ahorre tiempo cuando tropieces.

Trabajando en Swift 4.0.3

  NSLocationAlwaysAndWhenInUseUsageDescription Description NSLocationAlwaysUsageDescription Will you allow this app to always know your location? NSLocationWhenInUseUsageDescription Do you allow this app to know your current location? 

Sigue estos pasos:

Me encontré con el mismo problema con una aplicación que necesitaba “Autorización permanente” y la resolví siguiendo estos pasos:

1. Agregue la clave Info.plist a Info.plist

2. Agregue NSLocationAlwaysAndWhenInUseUsageDescription a Info.plist

3. Agregue NSLocationAlwaysUsageDescription a Info.plist (para admitir

4. requestWhenInUseAuthorization() llamada cuando requestWhenInUseAuthorization() ANTES de requestAlwaysAuthorization( )

No puede ejecutar requestAlwaysAuthorization () antes de requestWhenInUseAuthorization (). Debe escalar a ese nivel de permiso. Una vez que realicé estos cambios, las actualizaciones de ubicación comenzaron a funcionar correctamente nuevamente.

Más detalles se pueden encontrar aquí:

https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/requesting_always_authorization

Mejor prevenir que lamentar … En iOS 11: agregue lo siguiente y estará bien.

 NSLocationWhenInUseUsageDescription Description NSLocationAlwaysAndWhenInUseUsageDescription Description NSLocationAlwaysUsageDescription Description 

Swift: 3 me he enfrentado al mismo problema. Estaba totalmente equivocado al encontrar la solución. así es como arreglé el problema.

paso-1: archivo de proyecto> Capacidades> modos de fondo> seleccione Actualización de ubicación

paso-2: agregar NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageClases de descripción a Info.plist

paso 3 :

 manager.pausesLocationUpdatesAutomatically = false manager.allowsBackgroundLocationUpdates = true