使用 Photos.framework 来批量删除 iOS 照片

2018-01-18 11:05:21来源:https://imtx.me/archives/2643.html作者:I'm TualatriX人点击

分享

最近有个需求,就是把 iPad Pro 上的照片全部清空。我既不想用手动删除的方式,也不想用导入到电脑然后再删除的方式,于是想用写代码的方式来解决问题这个问题。经过初步了解,可以使用 Photos.framework 来解决这个问题,这里是一些基本使用概括:


PHFetchOptions 用于描述需要获取的 Asset 的类型、数量、排序规则和查询条件;
调用 PHAsset.fetchAssets 将 Asset 获取下来;
在 PHPhotoLibrary.shared().performChanges 的 Block 里面执行操作;
最后调用 PHAssetChangeRequest.deleteAssets 进行真正的删除。

调用成功后,App 的界面会显示这么一条,以给用户最后的确认机会:



几点需要注意的地方:


删除照片的 API 似乎没有进度汇报之类,所以一次性不要删除太多,不然会等很久;
我遇到数据库出问题的情况,有些照片程序找不到,手动也删除不掉,这时,就只能把设备抹掉重装了。

下面是源码:


let count = 100
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
options.includeHiddenAssets = true
options.includeAllBurstAssets = true
options.includeAssetSourceTypes = [.typeCloudShared,
.typeiTunesSynced,
.typeUserLibrary]
options.fetchLimit = count
let fetchRequest = PHAsset.fetchAssets(with: options)
PHPhotoLibrary.shared().performChanges({
var assets = [PHAsset]()
fetchRequest.enumerateObjects({ (asset, _, _) in
let canDelete = asset.canPerform(PHAssetEditOperation.delete)
if canDelete {
assets.append(asset)
}
})
PHAssetChangeRequest.deleteAssets(assets as NSArray)
}) { (finished, error) in
DispatchQueue.main.async {
 // Update your UI
}
}

Photos.framework 的 API 不是那么直观,但学会使用后,可以做一些很有意思的应用,比如查看任意时间的照片之类的。可以玩一玩。


微信扫一扫

第七城市微信公众平台