作品鏈接:
http://www.reibang.com/users/1e0f5e6f73f6/top_articles
- 需要導(dǎo)入第三方框架
#import <Photos/Photos.h>
#import <SVProgressHUD.h>
1.設(shè)置用戶訪問相簿的權(quán)限
- (IBAction)save {
/*
PHAuthorizationStatusNotDetermined, 用戶還沒有做出選擇
PHAuthorizationStatusDenied, 用戶拒絕當(dāng)前應(yīng)用訪問相冊(用戶當(dāng)初點(diǎn)擊了"不允許")
PHAuthorizationStatusAuthorized 用戶允許當(dāng)前應(yīng)用訪問相冊(用戶當(dāng)初點(diǎn)擊了"好")
PHAuthorizationStatusRestricted, 因為家長控制, 導(dǎo)致應(yīng)用無法方法相冊(跟用戶的選擇沒有關(guān)系)
*/
// 判斷授權(quán)狀態(tài)
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusRestricted) {
[SVProgressHUD showErrorWithStatus:@"因為系統(tǒng)原因,無法訪問相冊"];
} else if (status == PHAuthorizationStatusDenied){
// 用戶拒絕當(dāng)前應(yīng)用訪問相冊(用戶當(dāng)初點(diǎn)擊了"不允許")
PHLog(@"提醒用戶去[設(shè)置-隱私-照片-xxx]打開訪問開關(guān)");
} else if (status == PHAuthorizationStatusAuthorized){
//用戶允許當(dāng)前應(yīng)用訪問相冊 用戶當(dāng)初點(diǎn)擊了好
[self saveImage];
} else if (status == PHAuthorizationStatusNotDetermined){
// 用戶還沒有做出選擇
// 彈框請求用戶授權(quán)
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized) {
[self saveImage];
}
}];
}
}
2.保護(hù)圖片
- (void)saveImage
{
// PHAsset : 一個資源, 比如一張圖片\一段視頻
// PHAssetCollection : 一個相簿
// PHAssetCollection的標(biāo)識查乒,利用這個標(biāo)識可以找到對應(yīng)的PHAssetCollection的對象(相簿對象)
__block NSString *assetCollectionLocalIdentifier = nil;
__block NSString *assetLocalIdentifier = nil;
// PHAsset的標(biāo)識,利用這個標(biāo)識可以找到對應(yīng)的PHAsset對象 即圖片對象
// 如果想對"相冊"進(jìn)行修改(增刪改), 那么修改代碼必須放在[PHPhotoLibrary sharedPhotoLibrary]的performChanges方法的block中
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//1.保存圖片A到【相機(jī)膠卷】中
// 創(chuàng)建圖片的請求
assetLocalIdentifier = [PHAssetCreationRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success == NO) {
PHLog(@"保存【圖片】到【相機(jī)膠卷】中失斔取!失敗信息-%@",error);
return ;
}
// 獲得曾經(jīng)創(chuàng)建過的相簿
PHAssetCollection *createdAssetCollection = [self createdAssetCollection];
if (createdAssetCollection) {
// 3.添加【相機(jī)膠卷】中的圖片A到【相簿】D中
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
// 獲得圖片
PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetLocalIdentifier] options:nil].lastObject;
// 圖片添加到相簿中的請求
PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdAssetCollection];
// 添加圖片到相簿
[request addAssets:@[asset]];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success == NO) {
PHLog(@"添加[圖片]到[相簿]失敗!失敗信息-%@",error);
} else{
PHLog(@"成功添加[圖片]到[相簿]!");
}
}];
} else{
// 沒有創(chuàng)建過相簿
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//2.創(chuàng)建"相簿"D
// 創(chuàng)建相簿的請求
assetCollectionLocalIdentifier = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:PPHAssetCollectionTitle].placeholderForCreatedAssetCollection.localIdentifier;
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (!success) {
PHLog(@"保存相簿失敗!失敗信息-%@",error);
return ;
}
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
// 3.添加"相機(jī)膠卷"中的圖片A到新建的"相簿"D中
// 獲得相簿
PHAssetCollection *assetCollection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[assetCollectionLocalIdentifier] options:nil].lastObject;
// 獲得圖片
PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetLocalIdentifier] options:nil].lastObject;
// 添加圖片到相簿中的請求
PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
// 添加圖片到相簿
[request addAssets:@[asset]];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success == NO) {
PHLog(@"添加[圖片]到[相簿]失敗!失敗信息-%@",error);
} else{
PHLog(@"成功添加[圖片]到[相簿]!");
}
}];
}];
}
}];
}
3.創(chuàng)建相冊
- (PHAssetCollection *)createdAssetCollection
{
PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
for (PHAssetCollection *assetCollection in assetCollections) {
if ([assetCollection.localizedTitle isEqualToString:PPHAssetCollectionTitle]) {
return assetCollection;
}
}
return nil;
}