iOS Developer复制粘贴iOS 开发

iOS7删除相机照片

2016-07-01  本文已影响174人  塔塔简

                         取巧方式删除iOS7照片

1. 苹果在iOS8之前访问照片图库,主要是ALAssetsLibrary,可是这个库暴露的API没有直接删除照片的接口,网上可行方法是:[alasset setImageData:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error)],不过这个方法只能删除自身创建的图片,也就是alasset.isEditable = YES ,而该属性确实一个只读属性,如图1

图1

那不是App自身创建的照片,比如用户自己相机拍的照片如何删除呢?网上找了好久也没找到有私有API可以调用,即便有,也不好过苹果审核这一关。真的没有办法了吗? 

百度魔拍可以删除相机照片

咦?它是这么做到的呢?上IDA看看图2,也是调用上面方法,莫非它的‘isEditable’真有魔法?

图2

原来它用Category重写了这个方法 图3:

图3

[alasset setImageData:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error)]

看来‘setImageData’ 方法会先调用Alasset.isEditable 方法,然后执行setImageData操作,设置个断点看看,图4,果然

图4

2.原理知道了就好办了,ALAsset新建一个Category,上代码

#import "ALAsset+Delete.h"

@implementation ALAsset (Delete)

-(BOOL)isEditable{

return YES;

}@end

3.上面的方法在8.3固件后彻底失效,需要用Photos.framework(8.0固件引入的新framework) 里面提供的删除方法,这里上一份iOS8,9批量删除照片的代码:

PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:assetURLs options:nil];

if (result.count > 0)

{

NSMutableArray *toDeleteAssets = [NSMutableArray new];

for (PHAsset *asset in result) {

[toDeleteAssets addObject: asset];

}

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^

{

[PHAssetChangeRequest deleteAssets:toDeleteAssets];

}

completionHandler:^(BOOL success, NSError *error)

{

if ((!success) && (error != nil))

{

NSLog(@"Error deleting asset: %@", [error description]);

}

}];

}

代码段没格式化好,见谅哈,俺得熟悉下Markdown😍

有疑问到我微信公众号留言

![MineWeiXin.png](https://img.haomeiwen.com/i2137046/16b23595991cc783.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

上一篇下一篇

猜你喜欢

热点阅读