#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <Photos/Photos.h>
@interface SaveImageToFile : NSObject
//@property (nonatomic,copy) void(^SaveBlock)(BOOL isOK);
-(void)saveImage:(UIImage *)image SaveBlock:(void(^)(BOOL isOK))block;
@end
#import "SaveImageToFile.h"
@implementation SaveImageToFile
-(void)saveImage:(UIImage *)image SaveBlock:(void (^)(BOOL))block
{
// __block BOOL isSaveOK = NO;
//(1) 獲取當前的授權狀態
PHAuthorizationStatus lastStatus = [PHPhotoLibrary authorizationStatus];
//(2) 請求授權
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
//回到主線程
dispatch_async(dispatch_get_main_queue(), ^{
if(status == PHAuthorizationStatusDenied) //用戶拒絕(可能是之前拒絕的,有可能是剛才在系統彈框中選擇的拒絕)
{
if (lastStatus == PHAuthorizationStatusNotDetermined) {
//說明,用戶之前沒有做決定,在彈出授權框中,選擇了拒絕
// isSaveOK = NO;
block(NO);
return;
}else{
// isSaveOK = NO;
block(NO);
// 說明,之前用戶選擇拒絕過,現在又點擊保存按鈕,說明想要使用該功能,需要提示用戶打開授權
}
}else if (status == PHAuthorizationStatusRestricted)
{
// isSaveOK = NO;
block(NO);
}else if(status == PHAuthorizationStatusAuthorized) //用戶允許
{
//保存圖片---調用上面封裝的方法
[self saveImageToCustomAblum:image SaveBlock:block];
}
});
}];
}
/**將圖片保存到自定義相冊中*/
-(void)saveImageToCustomAblum:(UIImage *)image SaveBlock:(void (^)(BOOL))block
{
// __block BOOL isSaveOk = NO;
//1 將圖片保存到系統的【相機膠卷】中---調用剛才的方法
PHFetchResult<PHAsset *> *assets = [self syncSaveImageWithPhotos:image];
if (assets == nil)
{
block(NO);
return;
}
//2 擁有自定義相冊(與 APP 同名,如果沒有則創建)--調用剛才的方法
PHAssetCollection *assetCollection = [self getAssetCollectionWithAppNameAndCreateIfNo];
if (assetCollection == nil) {
block(NO);
return;
}
//3 將剛才保存到相機膠卷的圖片添加到自定義相冊中 --- 保存帶自定義相冊--屬于增的操作,需要在PHPhotoLibrary的block中進行
NSError *error = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
//--告訴系統,要操作哪個相冊
PHAssetCollectionChangeRequest *collectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
//--添加圖片到自定義相冊--追加--就不能成為封面了
//--[collectionChangeRequest addAssets:assets];
//--插入圖片到自定義相冊--插入--可以成為封面
[collectionChangeRequest insertAssets:assets atIndexes:[NSIndexSet indexSetWithIndex:0]];
// isSaveOk = YES;
NSLog(@"保存完成。。。");
NSLog(@"保存完成。。。");
block(YES);
} error:&error];
// if (error == nil) {
// block(NO);
// }else{
// block(YES);
// }
}
/**擁有與 APP 同名的自定義相冊--如果沒有則創建*/
-(PHAssetCollection *)getAssetCollectionWithAppNameAndCreateIfNo
{
//1 獲取以 APP 的名稱
NSString *title = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
//2 獲取與 APP 同名的自定義相冊
PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
for (PHAssetCollection *collection in collections) {
//遍歷
if ([collection.localizedTitle isEqualToString:title]) {
//找到了同名的自定義相冊--返回
return collection;
}
}
//說明沒有找到,需要創建
NSError *error = nil;
__block NSString *createID = nil; //用來獲取創建好的相冊
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
//發起了創建新相冊的請求,并拿到ID,當前并沒有創建成功,待創建成功后,通過 ID 來獲取創建好的自定義相冊
PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];
createID = request.placeholderForCreatedAssetCollection.localIdentifier;
} error:&error];
if (error) {
// [SVProgressHUD showErrorWithStatus:@"創建失敗"];
return nil;
}else{
// [SVProgressHUD showSuccessWithStatus:@"創建成功"];
//通過 ID 獲取創建完成的相冊 -- 是一個數組
return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createID] options:nil].firstObject;
}
}
/**同步方式保存圖片到系統的相機膠卷中---返回的是當前保存成功后相冊圖片對象集合*/
-(PHFetchResult<PHAsset *> *)syncSaveImageWithPhotos:(UIImage *)image
{
//--1 創建 ID 這個參數可以獲取到圖片保存后的 asset對象
__block NSString *createdAssetID = nil;
//--2 保存圖片
NSError *error = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
//----block 執行的時候還沒有保存成功--獲取占位圖片的 id,通過 id 獲取圖片---同步
createdAssetID = [PHAssetChangeRequest creationRequestForAssetFromImage:image].placeholderForCreatedAsset.localIdentifier;
} error:&error];
//--3 如果失敗,則返回空
if (error) {
return nil;
}
//--4 成功后,返回對象
//獲取保存到系統相冊成功后的 asset 對象集合,并返回
PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsWithLocalIdentifiers:@[createdAssetID] options:nil];
return assets;
}
@end
文/一月二十三(簡書作者)原文鏈接:http://www.lxweimin.com/p/43ae2a98147f