IOS中相册的一般处理

什么是PhotoKit

苹果的PhotoKit,是提供给开发者的对本地相册库的和iCloud 相册的资源进行操作的API,所有资源以PHAsset的形式来提供给PhotoKit使用,同时本地的图片库和iCloud图片的变动通知,会发送给PhotoKit;同时,PhotoKit也可以通过 变更请求 (编辑请求,改变请求,删除请求…)来对资源进行变更.

IOS中相册的一般处理
IOS中相册的一般处理

具体常用的类

PHObject: 抽象基类,其他PhotoKit类都继承该类,提供了一个localIdentifier属性

PHPhotoLibrary: 表示用户的照片库,用于请求、获取照片库的权限,监听照片库的变化;

PHAsset: 表示照片库中的一个单独的资源(可以是图片,也可以是视频;与ALAsset类似),用于获取、保存资源的元数据;PHAsset只包含元数据(如图片大小、创建日期等),具体的图片、视频数据需要使用PHImageManager进行加载;
若一个资源的representsBurst属性为true,则表示该资源是一系列连拍照片中的代表照片,可以通过fetchAssetsWithBurstIdentifier()方法,传入burstIdentifier属性,获取连拍照片中的剩余的其他照片;

PHAssetCollection: 资源集合,表示成组的资源;可以表示照片库中的一个相册、时刻、智能相册;
智能相册:系统默认提供的特定相册,如最近删除、视频列表、收藏等;

PHCollectionList: 表示一组PHCollections的集合;其本身也是PHCollection,故PHCollectionList也可以包含其他的PHCollectionList;

PHPhotoLibrary

PHPhotoLibrary类型的对象是对照片应用的所有的资源以及所有的集合进行管理的表现,包括了存储在本地设备上的资源和(如果允许的话)存储在iCloud上的资源。使用这个对象可以对照片库中的对象进行更改——例如,编辑资源数据或内容,插入一个新的资源,再或者更改一个集合中的成员。你也可以使用照片库对象注册Photos发送是否更改资源或集合的内容或者数据的消息,验证用户是否授权你的应用程序访问Photos的内容。

PHAsset,PHAssetCollection以及PHCollectionList
类型的实例是不可更改的对象。因此,想要修改Photos的资源或者集合,你应该使用共享的照片库来执行一个更改回调。在更改回调里面创建一个更改请求对象。你使用下面的“申请更改照片库”中的一个方法来申请一个更改回调。你在回调中申请的更改将在Photos运行这个回调并且调用你的完成处理回调之后生效。

每个更改请求的类——PHAssetChangeRequest,PHAssetCollectionChangeRequest和PHCollectionListChangeRequest——都对应一个资源或集合类。

创建与删除

  • + (instancetype)creationRequestForAssetCollectionWithTitle:(NSString *)title;

创建一个集合

  • + (void)deleteCollectionLists:(id)collectionLists;

删除一个集合列表。

监听与获取

  • - (void)registerChangeObserver:(id)observer;

方法来注册一个监听器.当图片库中的一个对象发生改变的时候接收通知。
监听变化后使用PHPhotoLibraryChangeObserver协议接收更改。

  • (void)unregisterChangeObserver:(id)observer;

移除一个已经注册的监听器,使得这个监听器不再接收图片库中一个对象的改变通知。

  • - (PHFetchResult<PHAsset *> *)fetchAssetsWithOptions:(PHFetchOptions *)options;)

来获取资源或者集合,Photos会自动注册你获取到的内容为监听器的监听内容。

更新

PHAssetChangeRequest: 用来创建、删除和修改PHAsset对象;

PHAssetCollectionChangeRequest: 用来创建、删除和修改PHAssetCollection对象;

PHCollectionListChangeRequest: 用来创建、删除和修改PHCollectionList对象;

Library的操作

  • + (PHPhotoLibrary *)sharedPhotoLibrary;

获取获取共享照片库对象,即获取PHPhotoLibrary的单例。

  • - (void)performChanges:(dispatch_block_t)changeBlock completionHandler:(nullable void(^)(BOOL success, NSError *__nullable error))completionHandler;

异步运行changeBlock回调,来请求执行对照片库的修改。Photos会在任意的串行队列上调用你的changeBlock回调和handler回调,如果你的回调中有需要与UI进行交互的内容,请将此工作分配到主线程。对于每次调用此方法,Photos都会展示一个提示告诉用户,请求用户允许编辑照片库内容。如果你的应用程序需要同时提交几个更改,请将它们合并到一个changeBlock中。

  • /- (BOOL)performChangesAndWait:(dispatch_block_t)changeBlock error:(NSError *__autoreleasing *)error;

同步运行changeBlock回调,来请求执行对照片库的修改。不要再主线程中执行此方法。由于执行此方法会向用户请求编辑照片库的权限,并且需要一定的时间进行修改,所以在主线程中执行此方法可能会导致无限期的阻塞主线程。

其他

  • + (PHFetchResult *)fetchAssetCollectionsWithLocalIdentifiers:(NSArray *)identifiers options:(nullable PHFetchOptions *)options;

该方法通过唯一标识符identifiers来获取相册 PHFetchOptions为将要获取到了相册的相关属性对象

  • + (PHFetchResult *)fetchAssetCollectionsWithLocalIdentifiers:(NSArray *)identifiers options:(nullable PHFetchOptions *)options;

该方法通过PHAssetCollectionType 相册分类枚举值获取相关相册 PHAssetCollectionSubtype 为子类型 即进一步想相册分类 如Album和 AlbumCoundShared组合表示从iTunes同步来的 并且是从icloud分享来的相册

相关枚举值如下
typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
PHAssetCollectionTypeAlbum= 1, //从iTunes同步而来的及用户自建的相册
PHAssetCollectionTypeSmartAlbum = 2,//相机拍摄而成的相册
PHAssetCollectionTypeMoment= 3,//Photos为我们自动生成的时间分组相册
}

enumPHAssetCollectionSubtype : Int {
caseAlbumRegular //用户在 Photos 中创建的相册
caseAlbumSyncedEvent //使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步过来的事件。然而,在iTunes 12 以及iOS 9.0 beta4上,选用该类型没法获取同步的事件相册,而必须使用AlbumSyncedAlbum。
caseAlbumSyncedFaces //使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步的人物相册。
caseAlbumSyncedAlbum//做了 AlbumSyncedEvent 应该做的事
caseAlbumImported//从相机或是外部存储导入的相册,完全没有这方面的使用经验,没法验证。
caseAlbumMyPhotoStream//用户的 iCloud 照片流
caseAlbumCloudShared//用户使用 iCloud 共享的相册
caseSmartAlbumGeneric//文档解释为非特殊类型的相册,主要包括从 iPhoto 同步过来的相册。由于本人的 iPhoto 已被 Photos 替代,无法验证。不过,在我的 iPad mini 上是无法获取的,而下面类型的相册,尽管没有包含照片或视频,但能够获取到。
caseSmartAlbumPanoramas//相机拍摄的全景照片
caseSmartAlbumVideos//相机拍摄的视频
caseSmartAlbumFavorites//收藏文件夹
caseSmartAlbumTimelapses//延时视频文件夹,同时也会出现在视频文件夹中
caseSmartAlbumAllHidden//包含隐藏照片或视频的文件夹
caseSmartAlbumRecentlyAdded//相机近期拍摄的照片或视频
caseSmartAlbumBursts//连拍模式拍摄的照片,在 iPad mini 上按住快门不放就可以了,但是照片依然没有存放在这个文件夹下,而是在相机相册里。
caseSmartAlbumSlomoVideos//Slomo 是 slow motion 的缩写,高速摄影慢动作解析,在该模式下,iOS 设备以120帧拍摄。不过我的 iPad mini 不支持,没法验证。
caseSmartAlbumUserLibrary//这个命名最神奇了,就是相机相册,所有相机拍摄的照片或视频都会出现在该相册中,而且使用其他应用保存的照片也会出现在这里。
caseAny//包含所有类型
}