objective-c geolocation ios8 privacy

objective c - Solicitud de iOS 8CuandoInutilizarAutorizaciĆ³n no emergente



objective-c geolocation (6)

Intenté hacer que mi AppProject iOS 8 estuviera listo. Había leído mucho sobre

[_locationManager requestWhenInUseAuthorization];

y la entrada en plist

NSLocationWhenInUseUsageDescription

Así que cambié todas las líneas de código necesarias.

Funciona bien, pero ahora he vuelto a copiar mi proyecto desde mi base de iOS 7 para incluir nuevas funciones. Pero cuando hago los cambios para la privacidad de la ubicación de iOS8, el elemento emergente ya no aparece.

Mi código funcionó hasta que lo copié.

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>NSLocationWhenInUseUsageDescription</key> <string>tolle sache </string> <key>CFBundleDevelopmentRegion</key> <string>en</string> <key>CFBundleExecutable</key> <string>${EXECUTABLE_NAME}</string> <key>CFBundleIdentifier</key> <string>fapporite.${PRODUCT_NAME:rfc1034identifier}</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundlePackageType</key> <string>BNDL</string> <key>CFBundleShortVersionString</key> <string>1.0</string> <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> <string>1</string> </dict> </plist>

y aqui esta mi llamada

- (instancetype)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self) { _UserLocation = [[CLLocation alloc]init]; _locationManager = [[CLLocationManager alloc]init]; // initializing locationManager _locationManager.delegate = self; _locationManager.desiredAccuracy = kCLLocationAccuracyBest; // setting the accuracy [_locationManager requestWhenInUseAuthorization]; // iOS 8 MUST [_locationManager startUpdatingLocation]; //requesting location updates NSLog(@"passed initwithcode"); } return self; }

¿Cómo puedo arreglar esto?


Aquí hay un poco de gotcha. Asegúrese de que está agregando las claves NSLocationAlwaysUsageDescription o NSLocationWhenInUseUseUsageDescription a la lista del paquete principal y no a una de sus listas de objetivos de prueba.


De la documentación

NSLocationWhenInUseUsageDescription (String - iOS) describe la razón por la cual la aplicación accede a la ubicación del usuario normalmente mientras se ejecuta en primer plano. Incluya esta clave cuando su aplicación utilice servicios de ubicación para rastrear la ubicación actual del usuario directamente. Esta clave no admite el uso de servicios de ubicación para monitorear regiones o monitorear la ubicación del usuario utilizando el servicio de cambio de ubicación significativo. El sistema incluye el valor de esta clave en el panel de alerta que se muestra al usuario cuando solicita permiso para usar los servicios de ubicación.

Esta clave es necesaria cuando utiliza el método requestWhenInUseAuthorization de la clase CLLocationManager para solicitar autorización para los servicios de ubicación. Si la clave no está presente cuando llama al método requestWhenInUseAuthorization sin incluir esta clave, el sistema ignorará su solicitud.

Esta clave es compatible con iOS 8.0 y versiones posteriores. Si su archivo Info.plist incluye esta clave y la clave NSLocationUsageDescription, el sistema usa esta clave e ignora la clave NSLocationUsageDescription.

Lea sobre esto here .

Me parece que la forma más fácil de agregar esta clave a su info.plist es hacer clic derecho en su info.plist y elegir

Abrir como-> Código fuente

y luego agregue lo siguiente al final antes </dict></plist>

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

Si lo desea, puede agregar un texto entre <string></string> que describa al usuario por qué quiere usar su ubicación. Este texto se mostrará debajo del texto predeterminado en la alerta.


Intente escribir una NSLocationWhenInUseUsageDescription en Info.plist


Perteneciente al Apple Watch:

requestWhenInUseAuthorization colocar la clave requestWhenInUseAuthorization en la lista de información del iPhone, no en la aplicación WatchKit.

Esto me ha mordido dos veces ahora.



iOS 8.3, Xcode 6.3.1, ARC habilitado

La pregunta se ha resuelto, pero tengo (2) notas para agregar de mi reciente participación con CLLocationManager.

1) Debe tener las siguientes claves ingresadas en su archivo * .plist:

Las claves más utilizadas tienen nombres genéricos más descriptivos, como "Privacidad - Descripción del uso de la ubicación", que en realidad es la clave "Descripción de uso de ubicación de ubicación".

Para ver los nombres de las claves "sin procesar", vaya a "* -Info.plist" y haga clic con el botón derecho en el área del navegador donde se encuentran las claves, vea a continuación:

Y obtienes los siguientes resultados:

Las tres claves que están relacionadas con este artículo son:

2) Asegúrese de asignar e inicializar su implementación de CLLocationManager antes de intentar solicitar una autorización o actualizar la ubicación.

* .h archivo:

@interface SomeController : UIViewController <CLLocationManagerDelegate> @property (strong, nonatomic) CLLocationManager *locationManager;

* .m archivo:

- (IBAction)locationButton:(UIButton *)sender { if (self.locationManager == nil) { self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; } else { nil; } if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { [self.locationManager requestWhenInUseAuthorization]; } else { nil; } self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; [self.locationManager startUpdatingLocation]; }

Espero que esto le ahorra tiempo a alguien! Gracias.