Acabo de reconstruir mi aplicación con el SDK de iOS 11 en un intento de eliminar el blue banner
que 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?
Respuestas:
Parece que Apple ha agregado otra característica de privacidad. El usuario ahora puede anular nuestro
requestAlwaysAuthorization
y degradarlo arequestWhenInUseAuthorization
, 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:
Lo que contradice directamente el comentario que encontré en el
CLLocationManager.h
archivo actualizado . Entonces he creado un radar.Buenas noticias, si sigue los consejos de la consola de depuración, IE. agregue la nueva clave
NSLocationAlwaysAndWhenInUseUsageDescription
y una de las claves antiguasNSLocationWhenInUseUsageDescription
, los servicios de ubicación comenzarán a funcionar nuevamente.fuente
NSLocationAlwaysUsageDescription
agregué a mi Info.plist que es el permiso que necesito. Pero recibo el mensaje anterior en la consola que dice que también necesito agregarNSLocationWhenInUseUsageDescription
.startUpdatingLocation
orequestLocation
?startUpdatingLocation
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
fuente
viewwillAppear
y quitando al delegadoviewwilldisapper
. Si voy a configuración y selecciono el ya seleccionadoAllow Always
. Recibo la actualización solo una vez y luego no más. Algúna idea de cómo arreglar esto. ¡¡Gracias por adelantado!!trabajando bajo iOS11 descubrí, que Info.plist necesita al menos NSLocationAlwaysAndWhenInUseUsageDescription en Info.plist:
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()
ylocationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)
fallarán silenciosamente.Toma que muestra la traducción al alemán como ejemplo:
Espero que esto te ahorre tiempo cuando te encuentres.
fuente
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>
fuente
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
aInfo.plist
(para admitir <iOS 11)4. Llame
requestWhenInUseAuthorization()
ANTESrequestAlwaysAuthorization(
)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
fuente
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>
fuente
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) } }
fuente
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
fuente