写这篇文章的时间已经有点晚了,目前iOS支持的最低版本已经为iOS8了,而AssetsLibrary这个框架在iOS9已经支持了改为Photos代替使用(稍后会写文章介绍Photos),然而这并不影响,我们记录它的演化过程,AssetsLibrary框架也很小,思路很清晰整理一下以备回顾。
AssetsLibrary主要有五个类组成ALAssetsLibrary、ALAssetsGroup、ALAsset、ALAssetRepresentation、ALAssetsFilter,它们的关系大概是这样的(箭头从属关系):
AssetsLibrary包含了所有的图片和视频
ALAssetsGroup可以理解为相册,里面可以是图片也可以是视频,可以通过它增加某个相册的资源。
ALAssetsFilter为ALAssetsGroup设置过滤条件,返回图片、视频或者两者都返回。
ALAsset一个包装对象,它包装的可能是图片也可能是视频。
ALAssetRepresentation 是对ALAsset的详细描述,有很多属性例如:URL,对象的size,thumbnail缩略图,文件名等都可以获取到。
下面直接上代码分别介绍:
一、ALAssetsLibrary
使用ALAssetsLibrary是需要授权的,尤其是xcode8以后需要在info.plist里面添加key和描述如:
Privacy - Photo Library Usage Description : 是否允许xxx使用您的相册?
//ALAsset方向 NS_ENUM_DEPRECATED_IOS(4_0, 9_0)
typedef NS_ENUM(NSInteger, ALAssetOrientation) {
ALAssetOrientationUp , // 默认方向
ALAssetOrientationDown,// 向下
ALAssetOrientationLeft ,// 向左
ALAssetOrientationRight, //向右
ALAssetOrientationUpMirrored , // 图像沿水平方向,向上翻转
ALAssetOrientationDownMirrored, // 图像沿水平方向,向下翻转
ALAssetOrientationLeftMirrored , //图像沿垂直方向,向左翻转
ALAssetOrientationRightMirrored , //图像沿垂直方向,向右翻转
}
//相簿类型
enum {
ALAssetsGroupLibrary,//从iTunes 来的相册内容
ALAssetsGroupAlbum, //设备自身产生或从iTunes同步来的照片,包括其他软件产生的。
ALAssetsGroupEvent, // itun上有变动的照片
ALAssetsGroupFaces,// 尚不清楚
ALAssetsGroupSavedPhotos, //相机胶卷照片
ALAssetsGroupPhotoStream, //照片流ios5以后出现
ALAssetsGroupAll,// ALAssetsGroupAll 获取所有不为空的相册
};typedef NSUInteger ALAssetsGroupType
//ALAssetsLibrary授权状态
typedef NS_ENUM(NSInteger, ALAuthorizationStatus) {
ALAuthorizationStatusNotDetermined = 0, // 用户还没有做出选择这个应用程序的问候
ALAuthorizationStatusRestricted, // 这个应用程序没有被授权访问照片数据。当前用户不能改变应用程序的状态,是受限制的。如家长控制权限
ALAuthorizationStatusDenied, // 用户已拒绝该应用程序访问照片数据
ALAuthorizationStatusAuthorized // 用户已授权该应用可以访问照片数据
}
//先进行鉴权
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
ALAssetsLibrary的使用方法:
1、根据ALAssetsGroupType遍历相册(ALAssetsGroup没有快捷的创建方式,说明ALAssetsGroup一般都是从系统遍历获取,或者是URL获取):
ALAssetsLibrary *library = [[ALAssetsLibrary alloc]init];
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
ALAssetsFilter *filter = [ALAssetsFilter allPhotos];
[group setAssetsFilter:filter];
if ([group numberOfAssets]) {
NSURL *url = [group valueForProperty:ALAssetsGroupPropertyURL];
[self enumerateGroupWithURL:url];
*stop = YES;
}
} failureBlock:^(NSError *error) {
NSLog(@"%@",error);
}];
根据URL获取ALAssetsGroup或ALAsset
1、获取相册
[library groupForURL:groupUrl resultBlock:^(ALAssetsGroup *group) {
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
ALAssetRepresentation *representiaon = [result defaultRepresentation];
//获取图片大小单位B
long long size = [representiaon size];
NSLog(@"%lld",size);
}];
} failureBlock:^(NSError *error) {
NSLog(@"%@",error);
}];
2、获取ALAsset(通常搭配相机回调使用,保存图片)
[libarary writeImageToSavedPhotosAlbum:image.CGImage metadata:metadate completionBlock:^(NSURL *assetURL, NSError *error) {
[libarary assetForURL:assetURL resultBlock:^(ALAsset *asset) {
ALAssetRepresentation *representation = [asset defaultRepresentation];
NSString *filedName = [representation filename];
} failureBlock:^(NSError *error) {
NSLog(@"%@",error);
}];
}];