Los servicios de ubicación no funcionan en iOS 11

83

Acabo de reconstruir mi aplicación con el SDK de iOS 11 en un intento de eliminar el blue bannerque ahora siempre aparece. Pensé: "Genial, eso funcionó", solo para descubrir que los servicios de ubicación ahora no funcionan en absoluto.

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

William George
fuente
Agregue NSLocationAlwaysAndWhenInUseUsageDescription en Info.plist
Jayprakash Dubey

Respuestas:

156

Parece que Apple ha agregado otra característica de privacidad. El usuario ahora puede anular nuestro requestAlwaysAuthorizationy degradarlo a requestWhenInUseAuthorization, lo que significa que, como desarrollador, ahora tenemos que proporcionar ambas descripciones en elInfo.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 usar esta nueva clave, el servicio de ubicación aún no funcionaba, al buscar más, encontré esta gema mezclada con toda la información adicional de depuración:

Esta aplicación ha intentado acceder a datos sensibles a la privacidad 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 la aplicación usa estos datos

Lo que contradice directamente el comentario que encontré en el CLLocationManager.harchivo actualizado . Entonces he creado un radar.

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

William George
fuente
2
Me enfrento a una situación muy similar. Solo estoy probando en iOS 10.2 y NSLocationAlwaysUsageDescriptionagregué a mi Info.plist que es el permiso que necesito. Pero recibo el mensaje anterior en la consola que dice que también necesito agregar NSLocationWhenInUseUsageDescription.
Isuru
7
Desafortunadamente, el usuario ahora recibe un diálogo con tres respuestas, donde lo más probable es que sea golpeado debido a la impaciencia del usuario por comenzar es la mejor opción: "Solo mientras usa la aplicación". Lo que hará que las aplicaciones que requieren estar siempre en uso sean inútiles a menos que el usuario pase por la molestia de cambiar la configuración nuevamente después. ¡Al menos "Permitir siempre" debería haber sido la mejor opción cuando esto es lo que pide la aplicación!
Hans Terje Bakke
1
Agregué las tres claves descriptivas y todavía no recibo actualizaciones de ubicación. Estoy agregando locationmanagerdelgate en viewwillAppear y eliminando el delegado en viewwilldisapper. Si voy a la configuración y selecciono Permitir siempre ya seleccionado. Recibo la actualización solo una vez y luego no más. Algúna idea de cómo arreglar esto. ¡¡Gracias por adelantado!!
LoveMeSomeFood
@Uma - ¿estás llamando startUpdatingLocationo requestLocation?
William George
@WilliamGeorge Estoy usandostartUpdatingLocation
LoveMeSomeFood
43

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 UBICACIÓN ... por lo tanto, los nombres exactos de estas variables comienzan con "Privacidad - Ubicación ...", etc., agregue cada uno aquí, y describa cómo el usuario vería esto en la advertencia.

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

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:

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

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, agregue 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 es lo que funciona bien para mí, espero que el código también funcione para usted.

Saludos

Heider

Heider Sati
fuente
1
Agregué las tres claves descriptivas y todavía no recibo actualizaciones de ubicación. Estoy agregando locationmanagerdelgate viewwillAppear y quitando al delegado viewwilldisapper. Si voy a configuración y selecciono el ya seleccionado Allow Always. Recibo la actualización solo una vez y luego no más. Algúna idea de cómo arreglar esto. ¡¡Gracias por adelantado!!
LoveMeSomeFood
Agregaré mi código ahora para ilustrar lo que me funciona:
Heider Sati
Tengo el mismo código que el tuyo. Pero aún así, no recibo actualizaciones de ubicación, a menos que vaya a casa y vuelva a la aplicación. Esto sucede solo en iOS 11. Todavía no puedo entender por qué.
LoveMeSomeFood
¿Podrías echar un vistazo a este hilo? stackoverflow.com/questions/46616496/… . ¡Gracias!
LoveMeSomeFood
Hola, Uma, Uno de nuestros usuarios informó el mismo problema en uno de los dispositivos, estoy investigando esto y me comunicaré contigo, supongo que IOS11 nos mantiene a todos extremadamente ocupados en este momento ... Tendré que averiguarlo y resuelva esto lo antes posible, por favor tengan paciencia conmigo ... gracias
Heider Sati
23

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

ingrese la descripción de la imagen aquí

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

Toma que muestra la traducción al alemán como ejemplo:

ingrese la descripción de la imagen aquí

Espero que esto te ahorre tiempo cuando te encuentres.

iDoc
fuente
¡Gracias, @iDoc! Esto me ahorró mucho tiempo.
Reinhard Männer
Esta es la respuesta correcta, en iOS 11 es obligatorio localizar las claves de privacidad de la ubicación.
jberlana
Después de 10 horas llego a esta publicación ... tnx
1110
17

Trabajar en Swift 4.0.3

   <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
   <string>Description</string>

   <key>NSLocationAlwaysUsageDescription</key>
   <string>Will you allow this app to always know your location?</string>

   <key>NSLocationWhenInUseUsageDescription</key>
   <string>Do you allow this app to know your current location?</string>  
Keshav Gera
fuente
Gracias vipulkumarmehta
Keshav Gera
13

Sigue estos pasos:

Me encontré con el mismo problema con una aplicación que necesitaba "Autorización siempre" y lo resolví siguiendo estos pasos:

1. Agregar NSLocationWhenInUseUsageDescription clave aInfo.plist

2. Agregar NSLocationAlwaysAndWhenInUseUsageDescription aInfo.plist

3. Agregar NSLocationAlwaysUsageDescription a Info.plist(para admitir <iOS 11)

4. Llame requestWhenInUseAuthorization() ANTES requestAlwaysAuthorization( )

No puede ejecutar requestAlwaysAuthorization () antes que requestWhenInUseAuthorization (). Debe escalar a ese nivel de permiso. Una vez que hice 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

mhit0
fuente
1
Nada cambió con eso :(
Cemal BAYRI
Lo resolví habilitando la bandera allowBackgroundLocationUpdates. Ver stackoverflow.com/a/50733860/2610888
Andrea Gorrieri
6

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

<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>
Abhishek Bedi
fuente
5

Probado en iOS 12.2 con Swift 5

Paso 1. debe agregar los siguientes permisos de privacidad en el archivo plist

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>

<key>NSLocationWhenInUseUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>

Paso 2.Asegúrate de tener el siguiente código rápido para obtener las ubicaciones actuales

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    // MARK: Variables declearations
    @IBOutlet weak var mapView: MKMapView!
    var locationManager: CLLocationManager!

    // MARK: View Controller life cycle methods
    override func viewDidLoad() {
        super.viewDidLoad()
        //TODO: Make user you must add following three privacy permissions in plist
        //NSLocationWhenInUseUsageDescription
        //NSLocationAlwaysAndWhenInUseUsageDescription
        //NSLocationAlwaysUsageDescription

        getCurrentLocation()
    }

    func getCurrentLocation()
    {
        if (CLLocationManager.locationServicesEnabled())
        {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestAlwaysAuthorization()
            locationManager.startUpdatingLocation()
        }
    }

    // MARK: Location Manager Delegate methods
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let locationsObj = locations.last! as CLLocation
        print("Current location lat-long is = \(locationsObj.coordinate.latitude) \(locationsObj.coordinate.longitude)")
        showOnMap(location: locationsObj)
    }
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Get Location failed")
    }

    func showOnMap(location: CLLocation )
    {
        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
        mapView.setRegion(region, animated: true)
    }
}
SwiftBoy
fuente
2

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

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

paso 2: agregue las claves NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription a Info.plist

paso 3 :

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true
Santosh Sahoo
fuente
allowBackgroundLocationUpdates definitivamente resolvió mi problema, no puedo creer que no se haya informado en otras respuestas y foros. De los documentos de Apple: "usa esta propiedad para habilitar y deshabilitar las actualizaciones en segundo plano mediante programación. Por ejemplo, puede establecer esta propiedad en verdadero solo después de que el usuario habilite funciones en su aplicación donde se necesitan actualizaciones en segundo plano". "El valor por defecto de esta propiedad es "falso." developer.apple.com/documentation/corelocation/…
Andrea Gorrieri