iPhone Obtenga UIImagePickerController Lat / Lng

Estoy usando el UIImagePickerController para tomar una foto y luego upload la foto a un WCF Service . Junto con la image, también tengo que enviar a la latitud y longitud de la foto.

¿Cómo puedo get esta información de la foto tomada?

He buscado en línea, pero no puedo encontrar una buena fuente de información. He visto sobre los datos EXIF que se pasan a través de la key UIImagePickerControllerMediaMetadata como parte del método de delegado didFinishPickingMediaWithInfo . Sin embargo, cuando imprimo los contenidos en el logging, no hay información de location.

Me estoy perdiendo algo, ¿tengo que activar los services de location antes de tomar la foto? ¿O hay otra forma de get la información?

Muchas gracias.

He estado pensando esto durante un par de días, y finalmente conseguí una solución. Como ya se sugirió, puede usar ALAssetsLibrary .

El selector de imágenes le dará un dictionary, que contiene una url que apunta al activo.

El elemento assetForURL de assetForURL: resultBlock: failureBlock: método usa bloques. Puede leer más sobre ellos desde el ejemplo aquí . Entonces, así es como manejamos la información proporcionada por el selector:

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { if ([picker sourceType] == UIImagePickerControllerSourceTypePhotoLibrary) { // We'll store the info to use in another function later self.imageInfo = info; // Get the asset url NSURL *url = [info objectForKey:@"UIImagePickerControllerReferenceURL"]; // We need to use blocks. This block will handle the ALAsset that's returned: ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) { // Get the location property from the asset CLLocation *location = [myasset valueForProperty:ALAssetPropertyLocation]; // I found that the easiest way is to send the location to another method [self handleImageLocation:location]; }; // This block will handle errors: ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) { NSLog(@"Can not get asset - %@",[myerror localizedDescription]); // Do something to handle the error }; // Use the url to get the asset from ALAssetsLibrary, // the blocks that we just created will handle results ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease]; [assetslibrary assetForURL:url resultBlock:resultblock failureBlock:failureblock]; } [picker dismissModalViewControllerAnimated:YES]; [picker release]; } 

Y a continuación, el método que maneja la image y los datos de location:

 - handleImageLocation:(CLLocation *)location { UIImage *image = [self.imageInfo objectForKey:UIImagePickerControllerOriginalImage]; // Do something with the image and location data... } 

Y, por supuesto, también puede get otra información sobre la image con este método mediante el uso de teclas:

 ALAssetPropertyType ALAssetPropertyLocation ALAssetPropertyDuration ALAssetPropertyOrientation ALAssetPropertyDate ALAssetPropertyRepresentations ALAssetPropertyURLs 

Nuevo desde iOS 8

Fue complicado con ALAssetLibrary , que ahora está en desuso, usa Photos.Framework en su lugar.

 func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { if let assertURL = info[UIImagePickerControllerReferenceURL] as? NSURL { let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([assertURL], options: nil) if let asset = fetchResult.firstObject as? PHAsset { print(asset.location) } } } 

Rapido y Facil 🙂

Es un 'bicho', supongo. Un UIImagePickerViewController no devolverá datos de location de las imágenes que select de él: como ha descubierto, se eliminan de los metadatos.

Sin embargo, si utiliza ALAssetLibrary para get sus imágenes, puede get los datos de location (en forma de un object CLLocation asociado con la image). Hay algún código en esta pregunta – problema de ALAsset de image de iPhone – que le ayudará a get un ALAsset de un UIImagePickerController .

Por supuesto, esto sería más fácil si pudiera get esa información del selector de inmediato, así que considere presentar una request de function con Apple.

Como su tipo de fuente parece ser UIImagePickerControllerSourceTypeCamera , esto se vuelve muy frustrante muy rápido, como ya sabe. La información de la location parece ser MIA.

Como alternativa a UIImageWriteToSavedPhotosAlbum() (que no hace reference a la image guardada), he intentado ALAssetsLibrary y -writeImageToSavedPhotosAlbum:metadata:completionBlock: (usando UIImagePickerControllerMediaMetadata para poblarlo, esperando que el marco complete los espacios en blanco con información de location).

Por desgracia, no hay tal suerte. Aunque este método devuelve una URL a la image guardada, todavía no puedo get información de ALAssetPropertyLocation . Incluso si utilizo la variante de orientación del método save, no sirve de nada.

En este punto, creo que el único recurso parece estar incorporando su propia información de location, como se describe aquí .

Sin embargo, me parece un tanto sospechoso que tendría que hacer esto, ya que esperaría que el marco lo maneje automáticamente por usted . De hecho, ni siquiera puedo get información de location de las fotos tomadas anteriormente . Esto es con todos los permissions otorgados en todos los lugares correctos, sin importar qué dispositivo use, iPhone o iPad. (Incluso la aplicación Camera tiene el permiso adecuado, FWIW.)