零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 基础
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 线程
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> OpenGL ES
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> GPUImage
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> AVFoundation
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> CocoaPods
一.保存文件到相册
1.UIImageWriteToSavedPhotosAlbum
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:Object-C 保存文件到相册
//@Time:2021/08/07 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
- (void)loadImageFinished:(UIImage *)image
{
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), (__bridge void *)self);
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
NSLog(@"image = %@, error = %@, contextInfo = %@", image, error, contextInfo);
}
2.AssetsLibrary
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:Object-C 保存文件到相册
//@Time:2021/08/07 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
- (void)loadImageFinished:(UIImage *)image
{
__block ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init];
[lib writeImageToSavedPhotosAlbum:image.CGImage metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
NSLog(@"assetURL = %@, error = %@", assetURL, error);
lib = nil;
}];
}
注意:使用该类时需要导入 AssetsLibrary.framework 。而且该类需要在 iOS4.0 以上可以使用,但是在 iOS9.0 之后就被标记为过时方法。
官方建议使用 Photos.framework 中的 PHPhotoLibrary 进行代替,也就是下面所说的第三种方法。
3.PHPhotoLibrary
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:Object-C 保存文件到相册
//@Time:2021/08/07 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
- (void)loadImageFinished:(UIImage *)image
{
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
/写入图片到相册
PHAssetChangeRequest *req = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
NSLog(@"success = %d, error = %@", success, error);
}];
}
4.总结
- 第一种方式是最常用的,使用起来很方便,传入 UIImage 就可以了,也不需要担心 iOS 不同版本的问题。唯一缺点就是无法找到对应添加的图片。
- 第二种方式是 iOS4 之后加入的,在 iOS9 后又不推荐使用了。他也提供了很直观的方式来保存图片,并且也能够取到保存后相对应的图片路径。
- 第三种方式是 iOS8 之后加入的,他的使用稍微复杂一点,但是它允许进行批量的操作,例如添加、修改、删除等。如果要做更加复杂的操作的话,这种方式是比较推荐的方式。
二.保存文件到相册时崩溃
崩溃日志如下:
2021-08-07 11:59:31.125562+0800 LearnAVFoundation[10211:1164953] success = 0, error = Error Domain=NSCocoaErrorDomain Code=2047 "Photos Access not allowed (authorization status 0)" UserInfo={NSLocalizedDescription=Photos Access not allowed (authorization status 0)}
2021-08-07 11:59:31.128983+0800 LearnAVFoundation[10211:1164951] [access] This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.
对于类似的崩溃请参考:《Xcode – This app has attempted to access privacy-sensitive data without a usage description.》
三.得到保存到相册的图片对象
也许会有人需要在保存相册后得到图片的 PHAsset 对象来进行后续操作。那么,这里对上面例子进行改进,在创建 PHAssetChangeRequest 后将它的 placeholderForCreatedAsset 属性的 localIdentifier 属性保存到一个数组中,等待操作完成后再通过这个数组来查找刚刚添加的图片对象。请看下面栗子:
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:Object-C 保存文件到相册
//@Time:2021/08/07 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
- (void)loadImageFinished:(UIImage *)image
{
NSMutableArray *imageIds = [NSMutableArray array];
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//写入图片到相册
PHAssetChangeRequest *req = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
//记录本地标识,等待完成后取到相册中的图片对象
[imageIds addObject:req.placeholderForCreatedAsset.localIdentifier];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
NSLog(@"success = %d, error = %@", success, error);
if (success)
{
//成功后取相册中的图片对象
__block PHAsset *imageAsset = nil;
PHFetchResult *result = [PHAsset fetchAssetsWithLocalIdentifiers:imageIds options:nil];
[result enumerateObjectsUsingBlock:^(PHAsset * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
imageAsset = obj;
*stop = YES;
}];
if (imageAsset)
{
//加载图片数据
[[PHImageManager defaultManager] requestImageDataForAsset:imageAsset
options:nil
resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
NSLog("imageData = %@", imageData);
}];
}
}
}];
}
四.猜你喜欢
- Xcode – The application’s Info.plist does not contain CFBundleShortVersionString.
- Xcode – This app has attempted to access privacy-sensitive data without a usage description.
- Xcode replace 使用正则表达式替换文字
- Object-C 获取系统字体和字体名字
- Object-C 加载 TTF/OTF/TTC 文件
- Object-C private var mobileDevice文件夹
- Object-C 保存文件到相册
- Object-C 沙盒简介
- Xcode – 查看真机 app 沙盒内容
- Object-C 沙盒和 NSBundle 区别
- Object-C 沙盒写调试日志
ChatGPT 3.5 国内中文镜像站免费使用啦
暂无评论内容