在市场上主流App中,大多数App都具有存储图片到自己App的相册中.苹果提供的方法只能存储图片到系统相册,下面讲一下怎么实现:

实现思路:

   1.对系统相册进行操作的前提必须导入#import <Photos/Photos.h>

     2.在用户点击保存之后,首先判断用户是否允许App访问相册.若不是不可以,提醒用户需要打开权限.

     3.进入用户相册之后,首先判断有没有改App储存图片的相册,有的话直接把图片存储进去,没有的话创建一个新的相册.

     4.在图片存储到相册的时候用到占位图片.

具体实现:

 

// 1.获取用户授权状态,状态有四种
    // 1) PHAuthorizationStatusNotDetermined  不确定
    // 2)  PHAuthorizationStatusRestricted, 家长控制,拒绝
    // 3)  PHAuthorizationStatusDenied, 拒绝
    // 4) PHAuthorizationStatusAuthorized 授权
    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
 // 2.判断用户的授权状态
    if (status == PHAuthorizationStatusNotDetermined) {
            // 如果状态是不确定的话,block中的内容会等到授权完成再调用
        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            // 授权完成就会调用
            if (status == PHAuthorizationStatusAuthorized) {
      //调用存储图片的方法
                [self savePhoto];
            }
        }];
        //如果允许访问
    } else if (status == PHAuthorizationStatusAuthorized) {
   //调用存储图片的方法
        [self savePhoto];
        //如果权限是拒绝
    } else {
        // 使用第三方框架,弹出一个页面提示用户去打开授权
       // [SVProgressHUD showInfoWithStatus:@"进入设置界面->找到当前应用->打开允许访问相册开关"];
    }
 
    #pragma mark - 该方法获取在图库中是否已经创建该App的相册
  //该方法的作用,获取系统中所有的相册,进行遍历,若是已有相册,返回该相册,若是没有返回nil,参数为需要创建  的相册名称
     - (PHAssetCollection *)fetchAssetColletion:(NSString *)albumTitle
    {
             // 获取所有的相册
             PHFetchResult *result = [PHAssetCollection           fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    //遍历相册数组,是否已创建该相册
    for (PHAssetCollection *assetCollection in result) {
        if ([assetCollection.localizedTitle isEqualToString:albumTitle]) {
            return assetCollection;
        }
    }
    return nil;
 }
 
   #pragma mark - 保存图片的方法
   - (void)savePhoto
  {
  //修改系统相册用PHPhotoLibrary单粒,调用performChanges,否则苹果会报错,并提醒你使用
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        
        // 调用判断是否已有该名称相册
       PHAssetCollection *assetCollection = [self fetchAssetColletion:
@"百思"];
        //创建一个操作图库的对象
        PHAssetCollectionChangeRequest *assetCollectionChangeRequest;
        
        if (assetCollection) {
            // 已有相册
            assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
        } else {
            // 1.创建自定义相册
            assetCollectionChangeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"百思"];
        }
        
        // 2.保存你需要保存的图片到系统相册(这里保存的是_imageView上的图片)
        PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:_imageView.image];
        
        // 3.把创建好图片添加到自己相册
   //这里使用了占位图片,为什么使用占位图片呢
  //这个block是异步执行的,使用占位图片先为图片分配一个内存,等到有图片的时候,再对内存进行赋值
        PHObjectPlaceholder *placeholder = [assetChangeRequest placeholderForCreatedAsset];
        [assetCollectionChangeRequest addAssets:@[placeholder]];
        
        
    } completionHandler:^(BOOL success, NSError * _Nullable error) {
        //弹出一个界面提醒用户是否保存成功
        if (error) {
            //[SVProgressHUD showErrorWithStatus:@"保存失败"];
        } else {
           // [SVProgressHUD showSuccessWithStatus:@"保存成功"];
        }
        
        
    }];
}