UIImagePickerControllerReferenceURL siempre devuelve nill

Estoy intentando get el nombre de la image que acabo de capturar desde la camera con el siguiente código. Pero [info objectForKey:@"UIImagePickerControllerReferenceURL"] siempre devuelve nil. ¿Cómo puedo get la URL?

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { self.myinfo = info; NSLog(@"Dismissing camera ui..."); [self.cameraUI dismissViewControllerAnimated:YES completion:nil]; NSLog(@"Getting media url..."); NSString *mediaURL = [info objectForKey:UIImagePickerControllerMediaURL]; NSLog(@"Media url = %@", mediaURL); NSLog(@"Getting media type..."); NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; NSLog(@"Selected mediaType: %@", mediaType); if(mediaURL) { NSLog(@"This is a video = %@", mediaURL); if (![mediaType isEqualToString:(NSString*)kUTTypeVideo]) { UISaveVideoAtPathToSavedPhotosAlbum(mediaURL, self, @selector(video:didFinishSavingWithError:contextInfo:), NULL); } } else { NSLog(@"This is a photo..."); self.originalImage = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage]; if (self.source == UIImagePickerControllerSourceTypeCamera && [mediaType isEqualToString:(NSString*)kUTTypeImage]) { // Image captunetworking from camera NSLog(@"Saving new image..."); if (self.source != UIImagePickerControllerSourceTypePhotoLibrary) { UIImageWriteToSavedPhotosAlbum(self.originalImage, self, @selector(image:didFinishSavingWithError:usingContextInfo:), nil); } } // Image selected from previous images. else { NSLog(@"Getting reference url..."); self.referenceURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"]; NSLog(@"Reference url = %@", [self.referenceURL absoluteString]); [self saveAssetData:self.originalImage :info]; } } } - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error usingContextInfo:(void*)ctxInfo { if (error) { NSLog(@"Resim kaydedilemedi: %@", [error localizedDescription]); NSString *title = @"Resim kaydedilemedi!"; NSString* message = @"Resim kaydedilirken hata oluştu!"; [self alertStatus:message:title]; } else { NSLog(@"Save asset data..."); [self saveAssetData:image :self.myinfo]; } } - (void)saveAssetData:(UIImage*)originalImage :(NSDictionary*)info { self.assetLibrary = [[ALAssetsLibrary alloc] init]; NSURL *url = [info objectForKey:@"UIImagePickerControllerReferenceURL"]; ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *asset) { ALAssetRepresentation *assetRep = [asset defaultRepresentation]; NSString *filename = [assetRep filename]; NSLog(@"File name = %@", filename); if(self.selectedMediaNames == nil) self.selectedMediaNames = [[NSMutableArray alloc] init]; [self.selectedMediaNames addObject:filename]; [self.tableView reloadData]; [self.activitIndicator stopAnimating]; [self.activitIndicator setHidden:true]; HMXShanetworkingDataManager *shanetworkingDataManager = [HMXShanetworkingDataManager shanetworkingManager]; [shanetworkingDataManager.uploaMedias addObject:originalImage]; [shanetworkingDataManager.uploaMediaNames addObject:filename]; }; ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *error) { NSLog(@"%@", error); }; [self.assetLibrary assetForURL:url resultBlock:resultblock failureBlock:failureblock]; } 

ACTUALIZAR:

Es un poco tarde, pero aquí cómo obtengo el nombre de la image o el video:

  • Compruebe UIImagePickerControllerMediaURL , si es null el medio es una image, si no es un video
  • Si la image o el video se acaba de tomar o grabar, guárdelo en el álbum de fotos.
  • Use ALAssetsLibrary para consultar el nombre del file.

Aquí está el código para save y get medios:

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { @try { [self.cameraUI dismissViewControllerAnimated:YES completion:nil]; mediaURL = [info objectForKey:UIImagePickerControllerMediaURL]; // If mediaURL is not null this should be a video if(mediaURL) { // This video is new just recorded with camera if (self.source == UIImagePickerControllerSourceTypeCamera) { // First save the video to photos album ALAssetsLibrary *library = [ALAssetsLibrary new]; [library writeVideoAtPathToSavedPhotosAlbum:mediaURL completionBlock:^(NSURL *assetURL, NSError *error){ if (error) { DDLogDebug(@"Failed to save the photo to photos album..."); } else { // Get the name of the video [self getMediaName:nil url:assetURL]; } }]; } else { // This is a video that recorded before // Get the name of the video [self getMediaName:nil url:[info objectForKey:UIImagePickerControllerReferenceURL]]; } } // This is an image else { self.originalImage = (UIImage*)[info objectForKey:UIImagePickerControllerOriginalImage]; // This image is new just taken with camera if (self.source == UIImagePickerControllerSourceTypeCamera) { // First save the image to photos album ALAssetsLibrary *library = [ALAssetsLibrary new]; [library writeImageToSavedPhotosAlbum:[self.originalImage CGImage] orientation:(ALAssetOrientation)[self.originalImage imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){ if (error) { DDLogDebug(@"Failed to save the vide to photos album..."); } else { // Get the name of the image [self getMediaName:self.originalImage url:assetURL]; } }]; } else { // This is an image that taken before // Get the name of the image [self getMediaName:self.originalImage url:[info objectForKey:@"UIImagePickerControllerReferenceURL"]]; } } } @catch (NSException *exception) { DDLogError(@"%@", [exception description]); } } 

Método real que obtiene el nombre de los medios:

 - (void)getMediaName:(UIImage*)originalImage url:(NSURL*)url { @try { ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *asset) { if (asset == nil) return; ALAssetRepresentation *assetRep = [asset defaultRepresentation]; NSString *fileName = [assetRep filename]; // Do what you need with the file name here }; ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *error) { DDLogError(@"Failed to get image or video name : %@", error); }; ALAssetsLibrary *library = [ALAssetsLibrary new]; [library assetForURL:url resultBlock:resultblock failureBlock:failureblock]; } @catch (NSException *exception) { DDLogError(@"%@", [exception description]); } } 

La image que captura con la camera desde dentro de la aplicación no tiene nombre. Siempre es nulo Debes save la image mediante progtwigción en la galería de fotos y savela con el nombre que quieras.

Coloque el siguiente código en didFinishPickingMediaWithInfo:

 NSURL *mediaUrl; NSString *imageURLString; self.selectImage = [info valueForKey:UIImagePickerControllerEditedImage]; if (mediaUrl == nil) { if (self.selectImage == nil) { self.selectImage = [info valueForKey:UIImagePickerControllerOriginalImage]; DebugLog(@"Original image picked."); }else { DebugLog(@"Edited image picked."); } } mediaUrl = (NSURL *)[info valueForKey:UIImagePickerControllerMediaURL]; imageURLString=[mediaUrl absoluteString]; DebugLog(@"Hi Image URL STRING : - %@",imageURLString); if ([StringUtils string:imageURLString contains:@"PNG"] || [StringUtils string:imageURLString contains:@"png"]) { self.isJPG = NO; self.profileImageName = @"profileImageName.png"; } else if ([StringUtils string:imageURLString contains:@"JPG"] || [StringUtils string:imageURLString contains:@"jpg"]) { self.isJPG = YES; self.profileImageName = @"profileImageName.jpg"; } 

Cuando configura la camera para kUTTypeMovie, solo obtendrá referenceurl y mediaurl. Devolverá nulo para kUTTypeImage.