網上有很多文章介紹了保存的圖片和視頻的到相簿的,幾經對比和測試,效果都不如人意。經過實測和取長補短,現將重構後的參考實例粘貼如下,僅供學習和參考:
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 指定不同類型,可將裏面進行再次分裝,已達到高效、精簡便於維護的目的。
另外,如果不保存到自定義相冊,一句代碼就搞定了。具體可以查閱網上相關文章,本實例親測真實有效。如有其它疑問請留言溝通交流。