Object-C 保存文件到相册

零基础 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);
                                                                    
                          }];
                }
            }
            
        }];
}

四.猜你喜欢


未经允许不得转载:猿说编程 » Object-C 保存文件到相册
喜欢(1) 打赏

评论抢沙发

评论前必须登录!

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏