IOS 保存圖片、視頻到自定義相簿

網上有很多文章介紹了保存的圖片和視頻的到相簿的,幾經對比和測試,效果都不如人意。經過實測和取長補短,現將重構後的參考實例粘貼如下,僅供學習和參考:

1、檢測相簿以及創建相簿:

/** 創建自定義相冊 */
+(void)isExistFolder:(NSString * _Nonnull)folderName
       andBackaction:(void(^ _Nullable)(PHAssetCollection * _Nullable assetCollection))backAction{
    
    __block BOOL isExists = NO;
    
    //首先獲取用戶手動創建相冊的集合
    PHFetchResult *collectonResuts = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil];
    
    //對獲取到集合進行遍歷
    [collectonResuts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        PHAssetCollection *assetCollection = obj;
        //folderName是我們寫入照片的相冊
        if ([assetCollection.localizedTitle isEqualToString:folderName])  {
            isExists = YES;
            
            if (backAction) backAction(assetCollection);
        }
    }];
    
    if (!isExists) {
        if (backAction) backAction(nil);
    }
}

+(void)createFolder:(NSString *_Nonnull)folderName
      andBackaction:(void(^ _Nullable)(PHAssetCollection *_Nullable assetCollection))backAction {
    
    [Utils isExistFolder:folderName
           andBackaction:^(PHAssetCollection * _Nullable assetCollection) {
               //存在
               if (assetCollection) {
                   if (backAction) backAction(assetCollection);
               }
               //不存在
               else{
                   [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
                       //添加HUD文件夾
                       [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:folderName];
                       
                   } completionHandler:^(BOOL success, NSError * _Nullable error) {
                       if (success) {
                           NSLog(@"創建相冊文件夾成功!");
                           
                           [Utils isExistFolder:folderName
                                  andBackaction:^(PHAssetCollection * _Nullable assetCollection) {
                                      if (backAction) backAction(assetCollection);
                                  }];
                       } else {
                           NSLog(@"創建相冊文件夾失敗:%@", error);
                           if (backAction) backAction(nil);
                       }
                   }];
               }
           }];
}

上面代碼需要導入系統文件 #import <Photos/Photos.h> ,並做好相冊訪問權限檢測,實例如下:

//MARK:相冊權限檢測
        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            if (status != PHAuthorizationStatusAuthorized) {
                NSLog(@"開啓權限設置");
                //[Utils openSetting];
                return;
            }
        }];

2、保存圖片到自定義相簿

//截圖
    UIImage *imgQRCode = [Utils screenShotForView:self.contentView];
    
    //保存圖片
    [Utils createFolder:K_APP_NAME
          andBackaction:^(PHAssetCollection *assetCollection) {
              NSLog(@"assetCollection:%@",assetCollection);
              
              dispatch_async(dispatch_get_main_queue(), ^{
                  [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
                      //請求創建一個Asset
                      PHAssetChangeRequest *assetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:imgQRCode];
                      
                      //請求編輯相冊
                      PHAssetCollectionChangeRequest *collectonRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
                      
                      //爲Asset創建一個佔位符,放到相冊編輯請求中
                      PHObjectPlaceholder *placeHolder = [assetRequest placeholderForCreatedAsset];
                      
                      //相冊中添加圖片
                      [collectonRequest addAssets:@[placeHolder]];
                      
                  } completionHandler:^(BOOL success, NSError *error) {
                      if (success) {
                          NSLog(@"保存二維碼成功!");
                          
                          dispatch_async(dispatch_get_main_queue(), ^{
                              [MBProgressHUD showSuccess:@"已保存到系統相冊"];
                          });
                          
                      } else {
                          NSLog(@"保存二維碼失敗:%@", error);
                          
                          dispatch_async(dispatch_get_main_queue(), ^{
                              [MBProgressHUD showError:error.localizedDescription];
                          });
                      }
                  }];
              });
          }];

screenShotForView 爲項目中生成截圖的靜態方法,此處設置爲自己需要保存的圖片 UIImage 對象即可。

K_APP_NAME 爲系統的全局宏常量,此處值爲當前 app名稱,實際改爲 相簿(相冊)名稱即可

/** 項目名 */
#define K_APP_NAME [[[NSBundle mainBundle] infoDictionary] valueForKey:@"CFBundleDisplayName"]

3、保存視頻到自定義相簿

//videoPath爲視頻下載到本地之後的本地路徑
- (void)saveVideoToAlbum:(NSURL *)videoPath{
    
    __weak typeof(self) weakSelf = self;
    [Utils createFolder:K_APP_NAME
         andBackaction:^(PHAssetCollection *assetCollection) {
             NSLog(@"assetCollection:%@",assetCollection);
             
             dispatch_async(dispatch_get_main_queue(), ^{
                 [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
                     //請求創建一個Asset
                     PHAssetChangeRequest *assetRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:videoPath];
                     
                     //請求編輯相冊
                     PHAssetCollectionChangeRequest *collectonRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
                     
                     //爲Asset創建一個佔位符,放到相冊編輯請求中
                     PHObjectPlaceholder *placeHolder = [assetRequest placeholderForCreatedAsset];
                     
                     //相冊中添加視頻
                     [collectonRequest addAssets:@[placeHolder]];
                     
                 } completionHandler:^(BOOL success, NSError *error) {
                     if (success) {
                         NSLog(@"保存視頻成功!");
                         
                         dispatch_async(dispatch_get_main_queue(), ^{
                             [MBProgressHUD showSuccess:@"視頻下載成功,已保存到系統相冊"];
                             
                            //刷新UI
                            //...
                         });
                         
                     } else {
                         NSLog(@"保存視頻失敗:%@", error);
                         
                         dispatch_async(dispatch_get_main_queue(), ^{
                             [MBProgressHUD showError:error.localizedDescription];
                         });
                     }
                 }];
             });
    }];
}

保存圖片或視頻,就是裏面一句代碼PHAssetChangeRequest 指定不同類型,可將裏面進行再次分裝,已達到高效、精簡便於維護的目的。

另外,如果不保存到自定義相冊,一句代碼就搞定了。具體可以查閱網上相關文章,本實例親測真實有效。如有其它疑問請留言溝通交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章