1 .導入#import "SavePhotosTool.h"到項目的目錄中

配置info.plist文件.png

自定義相簿.png
//
// ViewController.m
// 保存圖片到自定義相簿中
//
// Created by 徐流洋 on 2017/6/21.
// Copyright ? 2017年 南京南大尚誠軟件科技有限公司. All rights reserved.
//
#import "ViewController.h"
#import "SavePhotosTool.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (IBAction)saveBtnClick:(id)sender {
//先判斷授權的狀態(tài)/傳入圖片
[SavePhotosTool judgePHAuthorizationStatus:self.imageView.image];
}
@end
以下是工具類的.h文件
//
// SavePhotosTool.h
// 保存圖片到自定義相簿中
//
// Created by 徐流洋 on 2017/6/21.
// Copyright ? 2017年 南京南大尚誠軟件科技有限公司. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <Photos/Photos.h>
@interface SavePhotosTool : NSObject
/** 單例模式 */
+ (instancetype)shareManager;
/** 判斷授權狀態(tài) */
+ (void)judgePHAuthorizationStatus:(UIImage *)image;
@end
以下是工具類的.m文件
//
// SavePhotosTool.m
// 保存圖片到自定義相簿中
//
// Created by 徐流洋 on 2017/6/21.
// Copyright ? 2017年 南京南大尚誠軟件科技有限公司. All rights reserved.
//
#import "SavePhotosTool.h"
@implementation SavePhotosTool
static SavePhotosTool *share;
+ (instancetype)shareManager{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
share = [SavePhotosTool new];
});
return share;
}
+ (void)judgePHAuthorizationStatus:(UIImage *)image{
[self.shareManager judgePHAuthorizationStatus:image];
}
- (void)judgePHAuthorizationStatus:(UIImage *)image{
// PHAuthorizationStatusNotDetermined = 0, 用戶還沒有做出選擇
// PHAuthorizationStatusDenied, 用戶拒絕當前應用訪問相冊(用戶當初點擊了“不允許”)
// PHAuthorizationStatusAuthorized 用戶允許當前應用訪問相冊(用戶當初點擊了“好”)
// PHAuthorizationStatusRestricted, 因為家長控制,導致應用無法訪問相冊(跟用戶的選擇沒有關系)
//0.判斷授權狀態(tài)
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusRestricted) { //因為家長控制,導致應用無法訪問相冊(跟用戶的選擇沒有關系)
NSLog(@"因為系統(tǒng)原因,無法訪問相冊");
}else if (status == PHAuthorizationStatusDenied){ //用戶拒絕當前應用訪問相冊(用戶當初點擊了“不允許”)
NSLog(@"提醒用戶去用戶 [設置-隱私-照片-xxx]打開訪問開關");
}else if (status == PHAuthorizationStatusAuthorized){ //用戶允許當前應用訪問相冊(用戶當初點擊了“好”)
[self saveImage:image];
}else if (status == PHAuthorizationStatusNotDetermined){ //用戶還沒有做出選擇
//彈框請求用戶授權
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized) { //用戶點擊了好
[self saveImage:image];
}
}];
}
}
- (void)saveImage:(UIImage *)image{
//PHAsset:一個資源,比如:一張圖片/一段視頻
//PHAssectCollection:一個相簿
//如果想對“相冊”進行修改(增刪改),那么修改代碼必須放在[PHPhotoLibrary sharedPhotoLibrary] 的performChanges方法的block中
//PHAsset的標識,利用這個標識可以找到對應的PHAsset對象(圖片對象)
__block NSString *assetLocalIdentifier = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//1.保存圖片A到“相機膠卷”
//創(chuàng)建圖片的請求
assetLocalIdentifier = [PHAssetCreationRequest creationRequestForAssetFromImage:image].placeholderForCreatedAsset.localIdentifier;
}completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success == NO) {
[self showError:@"保存圖片到【相機膠卷】中失敗"];
return ;
}
//2.獲得相簿
PHAssetCollection *createAssetCollection = [self createAssetCollection];
if (createAssetCollection == nil) {
[self showError:@"創(chuàng)建相簿失??!"];
return;
}
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//3.添加剛保存到“相機膠卷”中的圖片,到“相簿”中
//獲得圖片
PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetLocalIdentifier] options:nil].lastObject;
//添加圖片到相簿中的請求
PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createAssetCollection];
//添加圖片到相簿
[request addAssets:@[asset]];
}completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success == NO) {
[self showError:@"添加圖片到【相簿】失敗"];
return ;
}else{
[self showSuccess:@"成功添加圖片到相簿"];
}
}];
}];
}
/**
* 獲取相簿
*/
- (PHAssetCollection *)createAssetCollection{
// 從已存在相簿中查找這個應用的相簿
//1.獲取軟件的名字
NSString *title = [NSBundle mainBundle].infoDictionary[(__bridge NSString *)kCFBundleNameKey];;
PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
for (PHAssetCollection * assetCollection in assetCollections) {
if ([assetCollection.localizedTitle isEqualToString:title]) {
return assetCollection;
}
}
//沒有找到對應的相簿,需要創(chuàng)建新的相簿
NSError *error = nil;
//PHAssetCollection的標識,利用這個標識可以找到對應的PHAssetCollection對象(相簿對象)
__block NSString *assetCollectionLocalIdentifier = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
//創(chuàng)建“相簿”D
PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];
PHObjectPlaceholder *placeholder = request.placeholderForCreatedAssetCollection;
assetCollectionLocalIdentifier = placeholder.localIdentifier;
} error:&error];
//如果有錯誤信息
if (error) return nil;
//獲得剛才創(chuàng)建的相簿
return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[assetCollectionLocalIdentifier] options:nil].lastObject;
}
- (void)showError:(NSString *)text{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@",text);
// [SVProgressHUD showErrorWithStatus:text];
});
}
- (void)showSuccess:(NSString *)text{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@",text);
// [SVProgressHUD showSuccessWithStatus:text];
});
}
@end
源碼下載↓
鏈接: https://pan.baidu.com/s/1c2AIVPu 密碼: wv2f