从用户的照片库中删除一张照片?

11

有没有一种方法可以从 UIImagePickerController 中删除已加载到我的应用程序中的图像?

我希望能够在用户执行特定操作时从用户的照片库中删除该图像。

我提示用户从他们的库中选择图像,然后将其加载到我的应用程序中,在此时应用程序执行一些酷炫的动画,然后实际上删除该图像。

请帮忙!

3个回答

16

苹果实际上不允许您通过API从照片库中删除内容。用户必须去“照片”应用程序并手动删除它们。苹果确实允许您向照片库中写入:

要将静止图像保存到用户的“已保存照片”相册中,请使用UIImageWriteToSavedPhotosAlbum函数。要将电影保存到用户的“已保存照片”相册中,请使用UISaveVideoAtPathToSavedPhotosAlbum函数。

但是,苹果现在没有类似于删除和编辑/覆盖现有照片的功能。


我们不能使用照片框架请求删除吗? 我认为,是的,我们可以。 - Abdul Yasin
PHAssetChangeRequest.deleteAssets([assetToDelete]) - Abdul Yasin
https://developer.apple.com/documentation/photos/phassetchangerequest/1624062-deleteassets - Abdul Yasin
请检查下面的答案 - Abdul Yasin

12

实际上,你可以通过使用UIImageWriteToSavedPhotosAlbum API调用将应用程序保存的照片删除(保存到照片库中)。

已记录的API [ALAsset setImageData:metadata:completionBlock:] 是可行的。

1)将图像“photo.jpg”添加到项目中

2)将图像保存到资产库:

ALAssetsLibrary *lib = [ALAssetsLibrary new];
UIImage *image = [UIImage imageNamed:@"photo.jpg"];
[lib writeImageToSavedPhotosAlbum:image.CGImage metadata:@{} completionBlock:^(NSURL *assetURL, NSError *error) {
    NSLog(@"Write image %@ to asset library. (Error %@)", assetURL, error);
}];

3). 进入默认相册,您将在“已保存照片”相册中找到photo.jpg。

4). 从媒体库中删除此图像:

ALAssetsLibrary *lib = [ALAssetsLibrary new];
[lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) {
        if(asset.isEditable) {
            [asset setImageData:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
                NSLog(@"Asset url %@ should be deleted. (Error %@)", assetURL, error);
            }];
        }
    }];
} failureBlock:^(NSError *error) {

}];

5). 前往默认相册,你会发现photo.jpg已被删除。


它可以工作:)。但是根据苹果文档,setImageData:metaData:completionBlock函数用于替换图像,而不是删除它。您确定在AppStore中不会出现问题吗? - Sukhrob
1
我已经在苹果商店有一个应用程序,这是一个公共API,在应用审核过程中没有问题。 - evanchin

2

是的,我们可以删除一张照片。我们可以使用PHAssetChangeRequest来进行此操作。

来自Apple:

用于创建、删除、更改元数据或编辑Photos资源内容的请求,用于在照片库更改块中使用。

class func deleteAssets(_ assets: NSFastEnumeration)

assets是一个PHAsset对象的数组,用于删除。

PHAssetChangeRequest.deleteAssets([assetToDelete])

那么,您可以使用上述代码来删除资产。

下面是 Swift 3 代码:

PHPhotoLibrary.shared().performChanges({
            let imageAssetToDelete = PHAsset.fetchAssets(withALAssetURLs: imageUrls as! [URL], options: nil)
            PHAssetChangeRequest.deleteAssets(imageAssetToDelete)
        }, completionHandler: {success, error in
            print(success ? "Success" : error )
        })

PHAsset.fetchAssets(withALAssetURLs:)已被弃用,我没有看到另一种从URL开始删除照片的方法。 - Gabbr Issimo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接