iOS相册中如何删除照片

作者: Lilin_Coder | 来源:发表于2015-11-08 22:20 被阅读10694次

    最近公司的app有一个新功能是在app中删除相册的照片 ,本来是一个比较简单地功能,在做的过程中却发现AssetsLibary 框架并没有提供删除相册的API,网络上查找的时候这方面的信息也很少,最终在stackoverflow上发现了一个巧妙的方法,使用[ALAsset setImageData:metadata:completionBlock:]来实现删除照片的功能,可是也有人说这个API虽然能删除照片,但是它的主要功能不是用来删除照片,在iOS8的时候再只用它删除照片就无效了。好在iOS8中我们可以直接使用 PhotoKit框架来完成操作,PhotoKit中直接提供了 [PHAssetChangeRequest deleteAssets:@[Asset]]API来完成对照片的删除功能。接下来我们介绍一下这两个照片库框架如何删除照片。

    在以前的iOS App中中我们通常用AssetsLibary框架来完成对照片库的操作,但是随着iOS 系统的更新,苹果在相机和照片库上都发生了很大的改变,比如最新的iOS9系统中会有单独的自拍、屏幕快照相册,现在仅仅使用AssetsLibary并不能对照片库进行很好地支持。在iOS8中Apple提供了新的框架 PhotoKit,相比老旧的AssetsLibary,PhotoKit表现的更好,更能完成设备和照片库的无缝工作。但是在现在的苹果用户中,iOS7系统还是占有很大的比例,所以AssetsLibary仍然具有使用意义。

    AssetsLibary删除照片(用于iOS7)

    1.在相册中添加一张照片

        ALAssetsLibrary *lib = [[ALAssetsLibrary alloc]init];
        UIImage *image = [UIImage imageNamed:@"pet"];
        [lib writeImageToSavedPhotosAlbum:image.CGImage metadata:@{} completionBlock:^(NSURL *assetURL, NSError *error) {
            NSLog(@"Write image(%@) to album . Error:(%@)", assetURL, error);
        }];
    

    2.在相册中删除照片

        ALAssetsLibrary *lib = [[ALAssetsLibrary alloc]init];
        [lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
            [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
                if (result.isEditable) {
                  //在这里imageData 和 metaData设为nil,就可以将相册中的照片删除
                    [result setImageData:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
                        NSLog(@"asset url(%@) should be delete . Error:%@ ", assetURL, error);
                    }];
                }
            }];
        } failureBlock:^(NSError *error) {
            
        }];
    

    PhotoKit 删除照片(用于iOS8, iOS9)

    1.在相册中添加一张照片

        //首先获取相册的集合
        PHFetchResult *collectonResuts = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:[PHFetchOptions new]] ;
        //对获取到集合进行遍历    
        [collectonResuts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            PHAssetCollection *assetCollection = obj;
        //Camera Roll是我们写入照片的相册
        if ([assetCollection.localizedTitle isEqualToString:@"Camera Roll"])  {
                [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
          //请求创建一个Asset             
           PHAssetChangeRequest *assetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:[UIImage imageNamed:@"pet"]];
          //请求编辑相册              
           PHAssetCollectionChangeRequest *collectonRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
          //为Asset创建一个占位符,放到相册编辑请求中
           PHObjectPlaceholder *placeHolder = [assetRequest placeholderForCreatedAsset ];
          //相册中添加照片
                    [collectonRequest addAssets:@[placeHolder]];
                } completionHandler:^(BOOL success, NSError *error) {
                    NSLog(@"Error:%@", error);
                }];
           }
          }];
    

    2.在相册中删除照片

        PHFetchResult *collectonResuts = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:[PHFetchOptions new]] ;
        [collectonResuts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            PHAssetCollection *assetCollection = obj;
            if ([assetCollection.localizedTitle isEqualToString:@"Camera Roll"])  {
                PHFetchResult *assetResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:[PHFetchOptions new]];
                [assetResult enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                   [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
                       //获取相册的最后一张照片
                       if (idx == [assetResult count] - 1) {
                           [PHAssetChangeRequest deleteAssets:@[obj]];
                       }
                   } completionHandler:^(BOOL success, NSError *error) {
                       NSLog(@"Error: %@", error);
                   }];
                }];
            }
        }];
    

    相关文章

      网友评论

      • 一路向北客:删除时候那个提示框拿不掉吗
      • 狗狗臭鸡蛋:[PHAssetChangeRequest deleteAssets:@[obj]];
        会弹出一个系统提示框,怎么设置弹窗的语言呢?比如一般是中文的,如何设置成英文呢?
        stoicer:这个弹框这么去掉呢
        c170dc2aa789:我也有这个疑问,同求:pensive:
      • 863c73f31933:楼主,我这边iOS10删除相册最后一张图片,照你上面的写法怎么不进方法呢
      • 634585edc862:你好,我现在选择多张图片删除,,体统会多次弹出一个提示框,,我怎么不让系统弹出那个提示框 或者是仅让它弹出一次呢
        char_hu:@FreeLeaves 因为没有找到解决方案,所以我换成了,存储到沙盒。这样,管理起来就更方便。
        FreeLeaves:@char_hu 解决了吗?分享一下下。。。
        char_hu:@子瓜虫 我也在关注你这个问题。希望找到解决方案了,相互讨论下,歇息
      • f3075a9056dc:您好,您的是删除最后一张照片,但我现在做的是一个导入选中照片,然后提示是否删除相册中的,我现在能获取这个导入的照片数组,请问这种情况要怎么删除相册中这些照片呢?
        推遍天下无敌手:@年轻的老司机 老司机,问题解决了吗?系统相册的图片怎么删除
      • 415c742fdf1a:恩恩,谢谢啦
      • 415c742fdf1a:亲,我要对相册中的某些图片加密,我想的是获取手机中的相簿的路径 ,找到文件加密,这样貌似不可行。。。如果通过这个框架得到图片再加密图片,是否就是加密了相册的图片?
        415c742fdf1a:谢谢哦
        Lilin_Coder:@果冻呀 不过现在的情况是拿到照片加密再保存,是会在相册再保存一张新的照片的,你可以看一下有没有接口能够直接修改原图片的?
        Lilin_Coder:@果冻呀 亲 ,我没研究过图片加密问题,爱莫能助。。
      • 遗忘的黑鹰:换一种说法,如何在适配IOS7~9的设备下,能够删除相册的照片?
        遗忘的黑鹰:@Lilin_Coder 嗯,我也是,没有IOS7的机器,现在只有通过IOS版本来做适配了,谢谢啦
        Lilin_Coder:@Smiacter_Yin iOS8以上使用Photokit的话能够删除相册测照片,AssetsLibary下好像是有这个情况,记得在知乎的某个回答上有人这么说过,因为我现在没有iOS7的机器,Xcode6.4下的iOS7模拟器也已经打不开了,所以现在无法验证这个问题,如果你有了验证结果的话请告诉我 :blush:
      • 遗忘的黑鹰:在IOS7中的删除方法,只能删除通过自己APP添加的asset,我想通过我自己的APP删除相册的asset咋个搞呢?isEditable默认为NO,readonly.
        ZhongXi:@Smiacter_Yin 我有设备,报了错误
        Error Domain=ALAssetsLibraryErrorDomain Code=-3300 "Write failed" UserInfo=0x14edf940 {NSLocalizedDescription=Write failed, NSUnderlyingError=0x14eb7580
        "The operation couldn’t be completed. (ALAssetsLibraryErrorDomain error -3300.)", NSLocalizedFailureReason=There was a problem writing this asset because the write failed.}
        遗忘的黑鹰:@iGeekXi 我和博主是一样的 目前手上没有ios7的设备 无法测试到是否能够删除 不过ios7和之后的系统版本是我写了两套代码的 通过系统版本调用不同的代码…… 删除的话仍没有测出来 没有设备……
        ZhongXi:@Smiacter_Yin 你好,请问iOS7删除图片的问题解决了嘛?谢谢~
      • ShawnDu:牛叉
        ShawnDu:@杜帅帅_shawn ୧(๑•̀⌄•́๑)૭

      本文标题:iOS相册中如何删除照片

      本文链接:https://www.haomeiwen.com/subject/rzochttx.html