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

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

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

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

Photos.framework 删除照片

几点需要注意的地方:

  • 删除照片的 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 不是那么直观,但学会使用后,可以做一些很有意思的应用,比如查看任意时间的照片之类的。可以玩一玩。

欢迎使用图拉鼎和他的团队开发的作品

One Switch - 多功能开关工具

常驻 macOS 菜单栏的开关工具,可以快速开关 AirPods、睡眠模式、切换黑暗模式等。

No Comment

Leave a Comment