一、引言
AssetsLibrary架構是專門用來操作相冊相關資源的一個架構,其是iOS4到iOS9之間常使用的一個架構,在iOS9之後,系統系統了Photos架構代替了AssetsLibrary架構,但是AssetsLibrary架構依然可以使用,并且其結構和設計思路依然值得我們進行分析學習。
二、概述
AssetsLibrary架構會作業系統的相冊,是以首先需要進行權限的申請,在使用之前,首先需要在Info.plist檔案中添加如下鍵值:
Privacy - Photo Library Usage Description
AssetsLibrary架構中核心的類關系如下圖所示:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SOykDZ1ImNlVjYhJDNyIGOmRjY0cDZmJTZxY2NzQmYh9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
三、ALAssetsLibrary資源庫對象
ALAssetsLibrary類用來建構資源庫對象,這個對象用來整體作業系統的相冊資源,在使用它之前我們可以使用下面的方法來擷取使用者的授權情況:
+ (ALAuthorizationStatus)authorizationStatus;
ALAuthorizationStatus枚舉定義了使用者的授權情況,定義如下:
typedef NS_ENUM(NSInteger, ALAuthorizationStatus) {
ALAuthorizationStatusNotDetermined, // 使用者尚未選擇是否授權
ALAuthorizationStatusRestricted, //應用尚未授權
ALAuthorizationStatusDenied), // 使用者拒絕授權
ALAuthorizationStatusAuthorized // 使用者已經授權
}
如果使用者尚未授權過,那麼任何通路操作都将觸發授權機制。
資源庫中的資源資料是以組的方式進行存儲,下面代碼示例了擷取資源組的方式:
_library = [[ALAssetsLibrary alloc]init];
[_library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (group) { // 周遊相冊還未結束
// 設定過濾器
[group setAssetsFilter:[ALAssetsFilter allPhotos]];
if (group.numberOfAssets) {
NSLog(@"%@",group);
}
} else { // 周遊結束(當group為空的時候就意味着結束)
NSLog(@"沒有相冊清單了");
}
} failureBlock:^(NSError *error) {
NSLog(@"失敗");
}];
上面示例的枚舉函數用來根據參數類型擷取資源組,ALAssetsGroupType參數決定擷取組的類型,可選值枚舉如下:
enum {
ALAssetsGroupLibrary ,// 編輯庫
ALAssetsGroupAlbum ,//相冊庫
ALAssetsGroupEvent ,//事件庫
ALAssetsGroupFaces ,// iTunes同步
ALAssetsGroupSavedPhotos ,// 儲存的相片
ALAssetsGroupPhotoStream ,// The PhotoStream album.
ALAssetsGroupAll ,//所有庫
};
枚舉過程中,我們可以過去到ALAssetsGroup類型的對象,這個對象中封裝了相片資源資訊,後面會介紹。
下面列舉了ALAssetsLibrary中其他常用的方法:
//直接通過URL來擷取資源
- (void)assetForURL:(NSURL *)assetURL resultBlock:(ALAssetsLibraryAssetForURLResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
//直接通過URL來擷取資源組
- (void)groupForURL:(NSURL *)groupURL resultBlock:(ALAssetsLibraryGroupResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
//向相冊庫中添加一個新的資源組 可以自定義名稱
- (void)addAssetsGroupAlbumWithName:(NSString *)name resultBlock:(ALAssetsLibraryGroupResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
//向相冊中寫入一張圖檔 orientation參數設定圖檔的方向
/*
typedef NS_ENUM(NSInteger, ALAssetOrientation) {
ALAssetOrientationUp , // 向上 預設的
ALAssetOrientationDown , // 向下
ALAssetOrientationLeft , // 向左
ALAssetOrientationRight , // 向右
ALAssetOrientationUpMirrored , //
ALAssetOrientationDownMirrored , // horizontal flip
ALAssetOrientationLeftMirrored , // vertical flip
ALAssetOrientationRightMirrored , // vertical flip
*/
- (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef orientation:(ALAssetOrientation)orientation completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;
//向相冊中寫入一張圖檔 并可以設定圖檔的中繼資料
- (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;
//向相冊中寫入圖檔資料 并可以設定中繼資料
- (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;
//将某個路徑的視訊寫入相冊中
- (void)writeVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock;
//檢查路徑中的視訊是否和相冊相相容
- (BOOL)videoAtPathIsCompatibleWithSavedPhotosAlbum:(NSURL *)videoPathURL;
當資源庫改變時,系統會發出如下通知:
//資源庫改變的通知
extern NSString *const ALAssetsLibraryChangedNotification;
通知中傳遞的資訊中包含如下字段:
//資源庫更新
extern NSString *const ALAssetLibraryUpdatedAssetsKey;
//插入組
extern NSString *const ALAssetLibraryInsertedAssetGroupsKey;
//更新組
extern NSString *const ALAssetLibraryUpdatedAssetGroupsKey;
//删除組
extern NSString *const ALAssetLibraryDeletedAssetGroupsKey;
下面列舉了操作過程中的一些異常定義:
ALAssetsLibraryUnknownError = -1, // 未知錯誤
ALAssetsLibraryWriteFailedError = -3300, //寫入錯誤
ALAssetsLibraryWriteBusyError = -3301, // 寫入繁忙 可以重試
ALAssetsLibraryWriteInvalidDataError = -3302, // 無效資料
ALAssetsLibraryWriteIncompatibleDataError = -3303, // 不相容的資料
ALAssetsLibraryWriteDataEncodingError = -3304, // 資料編碼錯誤
ALAssetsLibraryWriteDiskSpaceError = -3305, // 記憶體不足
ALAssetsLibraryDataUnavailableError = -3310, // 資料不可用
ALAssetsLibraryAccessUserDeniedError = -3311, // 權限錯誤
ALAssetsLibraryAccessGloballyDeniedError = -3312, // 權限錯誤