iOS8使用ALAssetsLibrar建立單獨文件夾方法以及刪除文件夾閃退的bug

在ios8如下的系統建立新相冊,而後在相冊中手動刪除了這個"琳小兮"相冊,再使用下面的代碼從新建立"琳小兮"相冊是沒有問題的:
ios

 [assetsLibrary addAssetsGroupAlbumWithName:@"琳小兮"
                                               resultBlock:^(ALAssetsGroup *group)
                 {
                     [groups addObject:group];
                 }
                                              failureBlock:nil];

ios8+ 包含ios8系統,若文件夾已被手動刪除,再建立同名文件夾的時候用上面的代碼則會崩潰,須要額外添加Photos.framework框架,並導入頭文件#import <Photos/Photos.h>,主要修改的代碼部分是把上面那段代碼作以下修改:數組

  [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^
                 {
                     [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"琳小兮"];
                 } completionHandler:^(BOOL success, NSError *error)
                 {
                     if (!success) {
                         NSLog(@"---error:%@",error.userInfo);
                     }
                 }];

下面是完整的demo,結合了網上的實例寫的,給你們作一個參考:框架

1.添加AssetsLibrary.framework 和 Photos.framework框架spa

2.導入頭文件code

#import <AssetsLibrary/AssetsLibrary.h>orm

#import <Photos/Photos.h>圖片

3.代碼以下:
ip

@interface ViewController ()<UIActionSheetDelegate>
{
    NSMutableArray *imageArray;      //存圖片的數組
    int selectedImageIndex;                 //當前長按的下標
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    imageArray = [[NSMutableArray alloc] initWithObjects:[UIImage imageNamed:@"1.png"],[UIImage imageNamed:@"2.png"],[UIImage imageNamed:@"3.png"],[UIImage imageNamed:@"4.png"], nil];
    
    [self initImageView];
}

#pragma mark - 建立UI
-(void)initImageView
{
    for (int i = 0; i < imageArray.count; i ++) {
        UIImageView *  _imageV = [[UIImageView alloc] initWithFrame:CGRectMake(100, 50+110*i, 80, 80)];
        _imageV.image = imageArray[i];
        _imageV.userInteractionEnabled = YES;
        _imageV.tag = 100+i;
        [_imageV addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)]];
        [self.view addSubview:_imageV];
    }
}

#pragma mark - 在手機相冊中建立新相冊
- (void)createAlbumInPhoneAlbum:(UIImage *)senderImage
{
    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)
            {
                //添加一個新的相冊
                //此方法在ios8.0系統上,以前用代碼建立的相冊,手動刪除它,再用這個庫去建立剛被刪除的相冊,這個時候方法回調是不會跑fail模塊的,它走的是正常流程,可是帶回來的group倒是nil
//                [assetsLibrary addAssetsGroupAlbumWithName:@"琳小兮"
//                                               resultBlock:^(ALAssetsGroup *group)
//                 {
//                     NSLog(@"--------%@",group);
//                     [groups addObject:group];
//                 }
//                                              failureBlock:nil];

                //爲了解決iOS8.0以上系統下沒法經過代碼建立被刪除過的同名相冊
                [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^
                 {
                     [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"琳小兮"];
                     
                 } completionHandler:^(BOOL success, NSError *error)
                 {
                     if (!success) {
                         NSLog(@"---error:%@",error.userInfo);
                     }
                 }];
                
                haveHDRGroup = YES;
            }
        }
        
    };
    
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:listGroupBlock failureBlock:nil];
    
    [self saveToAlbumWithMetadata:nil imageData:UIImagePNGRepresentation(senderImage) customAlbumName:@"琳小兮" completionBlock:^
     {
         //這裏能夠建立添加成功的方法
         [self showAlert:@"圖片保存成功!"];
     }
                     failureBlock:^(NSError *error)
     {
         //添加失敗通常是由用戶不容許應用訪問相冊形成的,這邊能夠取出這種狀況加以判斷一下
         if([error.localizedDescription rangeOfString:@"User denied access"].location != NSNotFound ||[error.localizedDescription rangeOfString:@"用戶拒絕訪問"].location!=NSNotFound){
             [self showAlert:error.localizedFailureReason];
         }
     }];
}

#pragma mark 保存圖片
- (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();
            }
        }
    }];
}

#pragma mark - 長按手勢
-(void)longPress:(UILongPressGestureRecognizer *)recognizer
{
    //當長按手勢結束的時候觸發
    if(recognizer.state == UIGestureRecognizerStateEnded)
    {
        UILongPressGestureRecognizer *tempLP = (UILongPressGestureRecognizer *)recognizer;
        //得到該手勢被添加到哪一個View
        UIImageView *imageV = (UIImageView *)tempLP.view;
        selectedImageIndex = (int)imageV.tag-100;
        
        NSLog(@"當前選中的是第%d張圖片",selectedImageIndex);
        
        UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:nil
                                                          delegate:self
                                                 cancelButtonTitle:@"取消"
                                            destructiveButtonTitle:nil
                                                 otherButtonTitles:@"保存到手機",nil];
        menu.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
        [menu showInView:self.view];
    }
}

#pragma mark UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch (buttonIndex) {
        case 0:
        {
            [self createAlbumInPhoneAlbum:imageArray[selectedImageIndex]];
        }
            break;
        default:
            break;
    }
}

#pragma mark encapsulationAlert
-(void)showAlert:(NSString *)altString
{
      UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"提示" message:altString delegate:nil cancelButtonTitle:@"肯定" otherButtonTitles: nil];
    [alertView show];
}
相關文章
相關標籤/搜索