Mi aplicación que funcionó bien en iOS 7 no funciona con el SDK de iOS 8.
CLLocationManager
no devuelve una ubicación, y tampoco veo mi aplicación en Configuración -> Servicios de ubicación . Hice una búsqueda en Google sobre el tema, pero no surgió nada. ¿Qué podría estar mal?
Respuestas:
Terminé resolviendo mi propio problema.
Aparentemente, en iOS 8 SDK,
requestAlwaysAuthorization
(para la ubicación en segundo plano) orequestWhenInUseAuthorization
(ubicación solo en primer plano)CLLocationManager
es necesario llamar antes de comenzar las actualizaciones de ubicación.También debe haber
NSLocationAlwaysUsageDescription
oNSLocationWhenInUseUsageDescription
ingresarInfo.plist
un mensaje para que se muestre en la solicitud. Agregar estos resolvió mi problema.Espero que ayude a alguien más.
EDITAR: Para obtener información más extensa, eche un vistazo a: Core-Location-Manager-Changes-in-ios-8
fuente
Me estaba arrancando el pelo con el mismo problema. Xcode te da el error:
Pero incluso si implementa uno de los métodos anteriores, no avisará al usuario a menos que haya una entrada en info.plist para
NSLocationAlwaysUsageDescription
oNSLocationWhenInUseUsageDescription
.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
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 lo he confirmado.
Puede encontrar más información sobre estas dos configuraciones aquí
fuente
Para asegurarse de que esto sea compatible con iOS 7, debe verificar si el usuario ejecuta iOS 8 o iOS 7. Por ejemplo:
fuente
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { ...
requestAlwaysAuthorization
método. Mi solución adicional era utilizar esta línea en elif
comunicado en lugar de una llamada método normal:[self.locationManager performSelector:@selector(requestAlwaysAuthorization)];
. Tal vez esto sea obvio para otras personas, pero me tomó un tiempo darme cuenta. Creo que es la solución correcta hasta que se lance el Xcode 6 final.__IPHONE_OS_VERSION_MAX_ALLOWED
(#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
)Y a su archivo info.plist
fuente
Según los documentos de Apple:
A partir de iOS 8, la presencia de un
NSLocationWhenInUseUsageDescription
o unaNSLocationAlwaysUsageDescription
se requiere valor clave en el archivo Info.plist de su aplicación. También es necesario solicitar permiso al usuario antes de registrarse para recibir actualizaciones de ubicación, ya sea llamando[self.myLocationManager requestWhenInUseAuthorization]
o[self.myLocationManager requestAlwaysAuthorization]
dependiendo de su necesidad. La cadena que ingresó en Info.plist se mostrará en el siguiente diálogo.Si el usuario concede permiso, es lo de siempre. Si niegan el permiso, no se informa al delegado de las actualizaciones de ubicación.
fuente
Ambas teclas toman una cadena
fuente
Mi solución que se puede compilar en Xcode 5:
fuente
El antiguo código para pedir ubicación no funcionará en iOS 8. Puede probar este método para la autorización de ubicación:
fuente
En iOS 8, debe hacer dos cosas adicionales para que la ubicación funcione: agregue una clave a su Info.plist y solicite autorización al administrador de ubicación para pedirle que comience
info.plist:
Agregue esto a su código
fuente
Un error común para los desarrolladores de Swift:
Primero asegúrese de agregar un valor a la lista para cualquiera
NSLocationWhenInUseUsageDescription
oNSLocationAlwaysUsageDescription
.Si todavía no ve una ventana emergente pidiendo autorización, observe si está poniendo la línea
var locationManager = CLLocationManager()
en elviewDidLoad
método de su controlador de vista . Si lo hace, incluso si llamalocationManager.requestWhenInUseAuthorization()
, no aparecerá nada. Esto se debe a que después de que viewDidLoad se ejecuta, la variable locationManager se desasigna (se borra).La solución es ubicar la línea
var locationManager = CLLocationManager()
en la parte superior del método de clase.fuente
Antes
[locationManager startUpdatingLocation];
, agregue una solicitud de servicios de ubicación de iOS8:Edite la aplicación
Info.plist
y agregue la claveNSLocationAlwaysUsageDescription
con el valor de cadena que se mostrará al usuario (por ejemplo,We do our best to preserve your battery life.
)Si su aplicación necesita servicios de ubicación solo mientras la aplicación está abierta, reemplace:
requestAlwaysAuthorization
conrequestWhenInUseAuthorization
yNSLocationAlwaysUsageDescription
conNSLocationWhenInUseUsageDescription
.fuente
Estaba trabajando en una aplicación que se actualizó a iOS 8 y los servicios de ubicación dejaron de funcionar. Probablemente obtendrá un error en el área de depuración de la siguiente manera:
Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.
Hice el procedimiento menos intrusivo. Primero agregue la
NSLocationAlwaysUsageDescription
entrada a su info.plist:Tenga en cuenta que no completé el valor de esta clave. Esto todavía funciona, y no estoy preocupado porque esta es una aplicación interna. Además, ya hay un título que solicita el uso de servicios de ubicación, por lo que no quería hacer nada redundante.
A continuación, creé un condicional para iOS 8:
Después de esto, el
locationManager:didChangeAuthorizationStatus:
método es llamar:Y ahora todo funciona bien. Como siempre, consulte la documentación .
fuente
Solución con compatibilidad con versiones anteriores:
Configure la clave NSLocationWhenInUseUsageDescription en su Info.plist
fuente
locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error
. Sin embargo, olvidó agregar startUpdatingLocation a la instrucción if, por lo que después de que lo aceptan o lo niegan, en realidad no llama a startUpdateLocation.Solución con compatibilidad con versiones anteriores que no produce advertencias de Xcode:
NSLocationWhenInUseUsageDescription
Clave de configuración en suInfo.plist
.Para iOS versión 11.0+ :
NSLocationAlwaysAndWhenInUseUsageDescription
clave de configuración en suInfo.plist
. junto con otras 2 llaves.fuente
Esto es un problema con iOS 8 Agregue esto a su código
y para info.plist:
fuente
NSLocationUsageDescription
no se usa en iOS8 +Para acceder a la ubicación del usuario en iOS 8, deberá agregar,
Esto le pedirá al usuario permiso para obtener su ubicación actual.
fuente
Procedimiento Objective-C Siga las siguientes instrucciones:
Para iOS-11 Para iOS 11 eche un vistazo a esta respuesta: acceso a la ubicación de iOS 11
Necesita agregar dos claves en plist y proporcionar el mensaje como se muestra a continuación:
Para iOS-10 y a continuación:
Métodos delegados
Procedimiento rápido
Siga las siguientes instrucciones:
Para iOS-11 Para iOS 11 eche un vistazo a esta respuesta: acceso a la ubicación de iOS 11
Necesita agregar dos claves en plist y proporcionar el mensaje como se muestra a continuación:
Para iOS-10 y a continuación:
Métodos delegados
fuente
Para aquellos que utilizan Xamarin , he tenido que añadir la clave
NSLocationWhenInUseUsageDescription
a la info.plist manualmente ya que no estaba disponible en los menús desplegables, ya sea en Xamarin 5.5.3 Build 6 o XCode 6.1 - solamenteNSLocationUsageDescription
estaba en la lista, y que causó elCLLocationManager
que siga fallar en silenciofuente
fuente
Un pequeño ayudante para todos ustedes que tienen más de un archivo Info.plist ...
Agregará la etiqueta necesaria a todos los archivos Info.plist en el directorio actual (y subcarpetas).
Otro es:
Agregará su descripción a todos los archivos.
fuente
Mantenga la información de Cocoa Keys siempre a su alcance para esas actualizaciones, aquí está el enlace:
https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW26
Disfrutar.
fuente
Recibo un error similar en iOS9 (trabajando con Xcode 7 y Swift 2): Intento de iniciar las actualizaciones de ubicación de MapKit sin solicitar autorización de ubicación. Debe llamar - [CLLocationManager requestWhenInUseAuthorization] o - [CLLocationManager requestAlwaysAuthorization] primero. Estaba siguiendo un tutorial pero el tutor estaba usando iOS8 y Swift 1.2. Hay algunos cambios en Xcode 7 y Swift 2, encontré este código y funciona bien para mí (si alguien necesita ayuda):
Finalmente, lo puse en info.plist: Lista de propiedades de información: NSLocationWhenInUseUsageDescription Valor: la aplicación necesita servidores de ubicación para el personal
fuente
Para acceder a la ubicación de los usuarios en iOS. Necesitas agregar dos llaves
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
en el archivo Info.plist.
Ver esta imagen a continuación.
fuente
Agregue la clave
NSLocationWhenInUseUsageDescription
oNSLocationAlwaysUsageDescription
(uso de GPS de fondo) con una cadena que solicite el uso de GPS eninfo.plist
cada objetivo.Solicite permiso ejecutando:
[self initLocationManager: locationManager];
Donde
initLocationManager
es:Recuerde que si las teclas no están en cada uno
info.plist
para cada objetivo, la aplicación no le preguntará al usuario. Elif
proporciona compatibilidad con iOS 7 y elrespondsToSelector:
método garantiza la compatibilidad futura en lugar de resolver el problema para iOS 7 y 8.fuente
El problema para mí fue que la clase que era
CLLocationManagerDelegate
era privada, lo que impedía que se llamara a todos los métodos delegados. Supongo que no es una situación muy común, pero pensé que lo mencionaría en caso de que ayude a alguien.fuente
Añado clave en los que
InfoPlist.strings
en iOS 8.4, mini iPad 2. Funciona también. No configuro ninguna clave, comoNSLocationWhenInUseUsageDescription
, en miInfo.plist
.InfoPlist.strings :
La base de este hilo , decía
as in iOS 7
, se puede localizar en InfoPlist.strings. En mi prueba, esas claves se pueden configurar directamente en el archivoInfoPlist.strings
.ACTUALIZAR:
Creo que
@IOS
el método es mejor. Agregue clave aInfo.plist
con valor vacío y agregue cadenas localizadas aInfoPlist.strings
.fuente