這篇博客的主要內容來源於cocoachina 裏的貼子,代碼能實如今在手機相冊(ios設備相冊)中建立相冊的功能,下面我就原文整理,在擴展一下。php
原文地址:http://www.cocoachina.com/bbs/read.php?tid=143383ios
使用代碼異步
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
使用這句話就能把圖片存入照片中了async
#import <AssetsLibrary/AssetsLibrary.h>
在須要添加相冊的地方調用代碼spa
//添加到相冊我讓它執行是異步執行的方式,若是不想用這種方式,能夠不去開一個線程 dispatch_async(dispatch_get_global_queue(0, 0), ^{ [self createAlbumInPhoneAlbum]; });
#pragma mark - 在手機相冊中建立相冊 - (void)createAlbumInPhoneAlbum { ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; NSMutableArray *groups=[[NSMutableArray alloc]init]; ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) { if (group) { [groups addObject:group]; } else { BOOL haveHDRGroup = NO; for (ALAssetsGroup *gp in groups) { NSString *name =[gp valueForProperty:ALAssetsGroupPropertyName]; if ([name isEqualToString:@"相冊名字"]) { haveHDRGroup = YES; } } if (!haveHDRGroup) { //do add a group named "XXXX" [assetsLibrary addAssetsGroupAlbumWithName:@"相冊名字" resultBlock:^(ALAssetsGroup *group) { [groups addObject:group]; } failureBlock:nil]; haveHDRGroup = YES; } } }; //建立相簿 [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:listGroupBlock failureBlock:nil]; [self saveToAlbumWithMetadata:nil imageData:UIImagePNGRepresentation(self.imageView.image) customAlbumName:@"相冊名字" completionBlock:^ { //這裏能夠建立添加成功的方法 } failureBlock:^(NSError *error) { //處理添加失敗的方法顯示alert讓它回到主線程執行,否則那個框框死活不願彈出來 dispatch_async(dispatch_get_main_queue(), ^{ //添加失敗通常是由用戶不容許應用訪問相冊形成的,這邊能夠取出這種狀況加以判斷一下 if([error.localizedDescription rangeOfString:@"User denied access"].location != NSNotFound ||[error.localizedDescription rangeOfString:@"用戶拒絕訪問"].location!=NSNotFound){ UIAlertView *alert=[[UIAlertView alloc]initWithTitle:error.localizedDescription message:error.localizedFailureReason delegate:nil cancelButtonTitle:NSLocalizedString(@"ok", nil) otherButtonTitles: nil]; [alert show]; [alert release]; } }); }]; } - (void)saveToAlbumWithMetadata:(NSDictionary *)metadata imageData:(NSData *)imageData customAlbumName:(NSString *)customAlbumName completionBlock:(void (^)(void))completionBlock failureBlock:(void (^)(NSError *error))failureBlock { ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; void (^AddAsset)(ALAssetsLibrary *, NSURL *) = ^(ALAssetsLibrary *assetsLibrary, NSURL *assetURL) { [assetsLibrary assetForURL:assetURL resultBlock:^(ALAsset *asset) { [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { if ([[group valueForProperty:ALAssetsGroupPropertyName] isEqualToString:customAlbumName]) { [group addAsset:asset]; if (completionBlock) { completionBlock(); } } } failureBlock:^(NSError *error) { if (failureBlock) { failureBlock(error); } }]; } failureBlock:^(NSError *error) { if (failureBlock) { failureBlock(error); } }]; }; [assetsLibrary writeImageDataToSavedPhotosAlbum:imageData metadata:metadata completionBlock:^(NSURL *assetURL, NSError *error) { if (customAlbumName) { [assetsLibrary addAssetsGroupAlbumWithName:customAlbumName resultBlock:^(ALAssetsGroup *group) { if (group) { [assetsLibrary assetForURL:assetURL resultBlock:^(ALAsset *asset) { [group addAsset:asset]; if (completionBlock) { completionBlock(); } } failureBlock:^(NSError *error) { if (failureBlock) { failureBlock(error); } }]; } else { AddAsset(assetsLibrary, assetURL); } } failureBlock:^(NSError *error) { AddAsset(assetsLibrary, assetURL); }]; } else { if (completionBlock) { completionBlock(); } } }]; }
ALAssetsLibrary提供了咱們對iOS設備中的相片、視頻的訪問。它是鏈接了咱們應用程序和相冊之間的訪問的一個橋樑。線程
指代一個相冊。code
每個ALAsset表明一個單一資源文件(也就是一張圖片,或者一個視頻文件)orm
ALAssetRepresentation封裝了ALAsset,包含了一個資源文件中的不少屬性。(能夠說是ALAsset的不一樣的表示方式,本質上都表示同一個資源文件)視頻