廢話不說,直接上代碼吧
.h 文件
#import <Foundation/Foundation.h>
@interface SaveImageToPHAsset : NSObject
/**保存圖片到自定義相冊*/
- (void)saveImages:(NSArray *)imageArrs;
@end
.m文件
#import "SaveImageToPHAsset.h"
#import <Photos/Photos.h>
@interface SaveImageToPHAsset()
@property (nonatomic, strong) NSMutableArray *listOfDownLoadImageArr;
@end
@implementation SaveImageToPHAsset
- (NSMutableArray *)listOfDownLoadImageArr {
if (!_listOfDownLoadImageArr) {
_listOfDownLoadImageArr = [NSMutableArray array];
}
return _listOfDownLoadImageArr;
}
- (void)saveImages:(NSArray *)imageArrs {
for (int i = 0; i <imageArrs.count; i++) {
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageArrs[i]]];
UIImage *image = [UIImage imageWithData:data]; // 取得圖片
[self.listOfDownLoadImageArr addObject:image];
}
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
// 2.判斷用戶的授權狀態
if (status == PHAuthorizationStatusNotDetermined) {
// 如果狀態是不確定的話,block中的內容會等到授權完成再調用
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
// 授權完成就會調用
if (status == PHAuthorizationStatusAuthorized) {
//調用存儲圖片的方法
[self CWWSavePhotos];
}
}];
//如果允許訪問
} else if (status == PHAuthorizationStatusAuthorized) {
//調用存儲圖片的方法
[self CWWSavePhotos];
//如果權限是拒絕
} else {
// 使用第三方框架,彈出一個頁面提示用戶去打開授權
[MBProgressHUD showText:@"進入設置打開允許訪問相冊開關" toView:nil];
}
}
- (void)CWWSavePhotos {
if (self.listOfDownLoadImageArr.count > 0) {
UIImage *image = [self.listOfDownLoadImageArr objectAtIndex:0];
[self savePhoto:image];
}
else {
}
}
#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:(UIImage *)imagePhoto
{
//修改系統相冊用PHPhotoLibrary單粒,調用performChanges,否則蘋果會報錯,并提醒你使用
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
// 調用判斷是否已有該名稱相冊
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
//以項目名字命名相冊
NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];
PHAssetCollection *assetCollection = [self fetchAssetColletion:app_Name];
//創建一個操作圖庫的對象
PHAssetCollectionChangeRequest *assetCollectionChangeRequest;
if (assetCollection) {
// 已有相冊
assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
} else {
// 1.創建自定義相冊
assetCollectionChangeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:app_Name];
}
// 2.保存你需要保存的圖片到系統相冊(這里保存的是_imageView上的圖片)
PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:imagePhoto];
// 3.把創建好圖片添加到自己相冊(ps:想保存到系統相冊,就注釋掉下邊一行代碼就ok)
//這里使用了占位圖片,為什么使用占位圖片呢
//這個block是異步執行的,使用占位圖片先為圖片分配一個內存,等到有圖片的時候,再對內存進行賦值
PHObjectPlaceholder *placeholder = [assetChangeRequest placeholderForCreatedAsset];
[assetCollectionChangeRequest addAssets:@[placeholder]];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
//彈出一個界面提醒用戶是否保存成功
if (error) {
//[SVProgressHUD showErrorWithStatus:@"保存失敗"];
} else {
// [SVProgressHUD showSuccessWithStatus:@"保存成功"];
[self.listOfDownLoadImageArr removeObjectAtIndex:0];
}
[self CWWSavePhotos];
}];
}
@end
調用的方法,直接引用頭文件,傳一個imageURL數組就可以了
[[SaveImageToPHAsset alloc] saveImages:_model.images];//保存圖片到相冊