iOS guarda una foto en un álbum específico de la aplicación

Estoy creando una aplicación para iOS 5. Quiero save una foto en el dispositivo.

Quiero save la foto en un álbum específico de mi aplicación, así que necesito crear el álbum y luego save fotos en el álbum.

Sé cómo crear el álbum:

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library addAssetsGroupAlbumWithName:@"MY APP NAME" resultBlock:^(ALAssetsGroup *group) { //How to get the album URL? } failureBlock:^(NSError *error) { //Handle the error }]; 

Quiero agregar fotos al nuevo álbum ahora, ¿cómo lo hago? ¡El código de muestra es muy apreciado!

Este artículo parece lograr lo que estás buscando con una categoría ALAssetsLibrary personalizada. Parece que hay algunos comentarios útiles debajo del artículo que pueden ayudar con el performance también.

Puede usar el siguiente código simplemente cambie el nombre del álbum:

 __weak ALAssetsLibrary *lib = self.library; [self.library addAssetsGroupAlbumWithName:@"My Photo Album" resultBlock:^(ALAssetsGroup *group) { ///checks if group previously created if(group == nil){ //enumerate albums [lib enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *g, BOOL *stop) { //if the album is equal to our album if ([[g valueForProperty:ALAssetsGroupPropertyName] isEqualToString:@"My Photo Album"]) { //save image [lib writeImageDataToSavedPhotosAlbum:UIImagePNGRepresentation(image) metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) { //then get the image asseturl [lib assetForURL:assetURL resultBlock:^(ALAsset *asset) { //put it into our album [g addAsset:asset]; } failureBlock:^(NSError *error) { }]; }]; } }failureBlock:^(NSError *error){ }]; }else{ // save image directly to library [lib writeImageDataToSavedPhotosAlbum:UIImagePNGRepresentation(image) metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) { [lib assetForURL:assetURL resultBlock:^(ALAsset *asset) { [group addAsset:asset]; } failureBlock:^(NSError *error) { }]; }]; } } failureBlock:^(NSError *error) { }]; 

Para cualquiera que quiera hacer esto a partir de iOS 9, las cosas se han complicado un poco más porque ALAssetsLibrary está en desuso a favor de la nueva biblioteca de Fotos.

Aquí hay un código Swift para agregar UIImages a un nombre de álbum específico (creando el álbum si no existe), es posible que deba hacer alguna refactorización / optimization para sus necesidades:

 func insertImage(image : UIImage, intoAlbumNamed albumName : String) { //Fetch a collection in the photos library that has the title "albumNmame" let collection = fetchAssetCollectionWithAlbumName(albumName) if collection == nil { //If we were unable to find a collection named "albumName" we'll create it before inserting the image PHPhotoLibrary.shanetworkingPhotoLibrary().performChanges({ PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(albumName) }, completionHandler: {(success : Bool, error : NSError?) in if error != nil { print("Error: " + error!.description) } if success { //Fetch the newly created collection (which we *assume* exists here) let newCollection = self.fetchAssetCollectionWithAlbumName(albumName) self.insertImage(image, intoAssetCollection: newCollection!) } } ) } else { //If we found the existing AssetCollection with the title "albumName", insert into it self.insertImage(image, intoAssetCollection: collection!) } } func fetchAssetCollectionWithAlbumName(albumName : String) -> PHAssetCollection? { //Provide the pnetworkingicate to match the title of the album. let fetchOption = PHFetchOptions() fetchOption.pnetworkingicate = NSPnetworkingicate(format: "title == '" + albumName + "'") //Fetch the album using the fetch option let fetchResult = PHAssetCollection.fetchAssetCollectionsWithType( PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.AlbumRegular, options: fetchOption) //Assuming the album exists and no album shares it's name, it should be the only result fetched let collection = fetchResult.firstObject as? PHAssetCollection return collection } func insertImage(image : UIImage, intoAssetCollection collection : PHAssetCollection) { //Changes for the Photos Library must be maded within the performChanges block PHPhotoLibrary.shanetworkingPhotoLibrary().performChanges({ //This will request a PHAsset be created for the UIImage let creationRequest = PHAssetCreationRequest.creationRequestForAssetFromImage(image) //Create a change request to insert the new PHAsset in the collection let request = PHAssetCollectionChangeRequest(forAssetCollection: collection) //Add the PHAsset placeholder into the creation request. //The placeholder is used because the actual PHAsset hasn't been created yet if request != nil && creationRequest.placeholderForCreatedAsset != nil { request!.addAssets([creationRequest.placeholderForCreatedAsset!]) } }, completionHandler: { (success : Bool, error : NSError?) in if error != nil { print("Error: " + error!.description) } } ) } 

Para aquellos que buscan la respuesta de Eddy en Objective-C.

#import <Photos/Photos.h>

 - (void)insertImage:(UIImage *)image intoAlbumNamed:(NSString *)albumName { //Fetch a collection in the photos library that has the title "albumNmame" PHAssetCollection *collection = [self fetchAssetCollectionWithAlbumName: albumName]; if (collection == nil) { //If we were unable to find a collection named "albumName" we'll create it before inserting the image [[PHPhotoLibrary shanetworkingPhotoLibrary] performChanges:^{ [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle: albumName]; } completionHandler:^(BOOL success, NSError * _Nullable error) { if (error != nil) { NSLog(@"Error inserting image into album: %@", error.localizedDescription); } if (success) { //Fetch the newly created collection (which we *assume* exists here) PHAssetCollection *newCollection = [self fetchAssetCollectionWithAlbumName:albumName]; [self insertImage:image intoAssetCollection: newCollection]; } }]; } else { //If we found the existing AssetCollection with the title "albumName", insert into it [self insertImage:image intoAssetCollection: collection]; } } - (PHAssetCollection *)fetchAssetCollectionWithAlbumName:(NSString *)albumName { PHFetchOptions *fetchOptions = [PHFetchOptions new]; //Provide the pnetworkingicate to match the title of the album. fetchOptions.pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:[NSString stringWithFormat:@"title == '%@'", albumName]]; //Fetch the album using the fetch option PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:fetchOptions]; //Assuming the album exists and no album shares it's name, it should be the only result fetched return fetchResult.firstObject; } - (void)insertImage:(UIImage *)image intoAssetCollection:(PHAssetCollection *)collection { [[PHPhotoLibrary shanetworkingPhotoLibrary] performChanges:^{ //This will request a PHAsset be created for the UIImage PHAssetCreationRequest *creationRequest = [PHAssetCreationRequest creationRequestForAssetFromImage:image]; //Create a change request to insert the new PHAsset in the collection PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:collection]; //Add the PHAsset placeholder into the creation request. //The placeholder is used because the actual PHAsset hasn't been created yet if (request != nil && creationRequest.placeholderForCreatedAsset != nil) { [request addAssets: @[creationRequest.placeholderForCreatedAsset]]; } } completionHandler:^(BOOL success, NSError * _Nullable error) { if (error != nil) { NSLog(@"Error inserting image into asset collection: %@", error.localizedDescription); } }]; } 

https://github.com/amazingmanthere/ZCPhotoLibrary

Esta es una class de utilidad simple para save o eliminar activos en la biblioteca de fotos del sistema.