AssetsLibrary
框架支持iOS 4 - iOS 9.因为目前项目还可以最低支持到iOS 8,所以写一写.其实对于一些类似QQ的使用率很高的项目都是iOS 9起了.所以建议大家还是使用PHAsset.
AssetsLibrary中有以下一些模块
/// 资源库(包含photo、video)
#import <AssetsLibrary/ALAssetsLibrary.h>
/// 映射照片库中的一个相册
#import <AssetsLibrary/ALAssetsGroup.h>
/// 对应相册中的一张照片或者视频,包含了照片或视频的详细信息,可以通过ALAsset获取缩略图.也可以通过ALAsset的实例方法保存照片或视频.
#import <AssetsLibrary/ALAsset.h>
/// 对ALAsset的封装.
#import <AssetsLibrary/ALAssetRepresentation.h>
/// 用于告诉系统是拿照片还是视频还是资源(资源包括两种)
#import <AssetsLibrary/ALAssetsFilter.h>
因为是读写资源.所以需要
NSPhotoLibraryUsageDescription
与NSPhotoLibraryAddUsageDescription
ALAssetsLibrary
查询方法
- (void)enumerateGroupsWithTypes:(ALAssetsGroupType)types usingBlock:(ALAssetsLibraryGroupsEnumerationResultsBlock)enumerationBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
- (void)assetForURL:(NSURL *)assetURL resultBlock:(ALAssetsLibraryAssetForURLResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
- (void)groupForURL:(NSURL *)groupURL resultBlock:(ALAssetsLibraryGroupResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
增加方法
/// 新建相册
- (void)addAssetsGroupAlbumWithName:(NSString *)name resultBlock:(ALAssetsLibraryGroupResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;
/// 新建图片
- (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
typedef NS_ENUM(NSInteger, ALAssetOrientation) {
/// 默认方向
ALAssetOrientationUp,
/// 180度旋转
ALAssetOrientationDown,
/// 90度逆时针旋转(左转90度)
ALAssetOrientationLeft,
/// 90度顺时针旋转(右转90度)
ALAssetOrientationRight,
/// 水平翻转(左右镜像)
ALAssetOrientationUpMirrored,
/// 垂直翻转(上下镜像)
ALAssetOrientationDownMirrored,
/// 左转90度
ALAssetOrientationLeftMirrored,
/// 右转90度
ALAssetOrientationRightMirrored,
}
其他方法
/// 能否保存视频到相册
- (BOOL)videoAtPathIsCompatibleWithSavedPhotosAlbum:(NSURL *)videoPathURL;
/// 权限判断
+ (ALAuthorizationStatus)authorizationStatus;
/// 关闭因为共享照片流产生的频繁通知
+ (void)disableSharedPhotoStreamsSupport;
ALAssetsGroup
/// 获取相册组的属性
- (id)valueForProperty:(NSString *)property;
/// 预览图
- (CGImageRef)posterImage;
/// 设置过滤器.如果未设置,则返回all
- (void)setAssetsFilter:(ALAssetsFilter *)filter
/// 一共有多少asset
- (NSInteger)numberOfAssets;
/// 检索
- (void)enumerateAssetsUsingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock;
- (void)enumerateAssetsWithOptions:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock;
- (void)enumerateAssetsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock;
/// 如果应用允许编辑group,返回YES.否则返回NO.
@property (nonatomic, readonly, getter=isEditable) BOOL editable;
/// 添加asset成功返回YES.否则返回NO.添加前需要检查一下能否添加
- (BOOL)addAsset:(ALAsset *)asset;
Groups Properties
// Groups Properties
extern NSString *const ALAssetsGroupPropertyName
extern NSString *const ALAssetsGroupPropertyType
extern NSString *const ALAssetsGroupPropertyPersistentID
extern NSString *const ALAssetsGroupPropertyURL
ALAsset
/// 获取property的值.
- (id)valueForProperty:(NSString *)property;
/// 获取具体的资源信息.
- (ALAssetRepresentation *)defaultRepresentation;
/// 根据representation UTI来返回具体资源信息
- (ALAssetRepresentation *)representationForUTI:(NSString *)representationUTI;
/// 返回适合平台类型的略缩图
- (CGImageRef)thumbnail;
/// 返回宽高比和asset相等的略缩图
- (CGImageRef)aspectRatioThumbnail;
/// 将asset写入相册(保存至相册)
- (void)writeModifiedImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;
/// 将指定路径的视频保存到相册
- (void)writeModifiedVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock;
/// 如果已修改的未保存则返回nil.如果已修改的已保存则返回原始的asset
@property (nonatomic, readonly) ALAsset *originalAsset;
/// 能否编辑
@property (nonatomic, readonly, getter=isEditable) BOOL editable;
/// 替换asset中的图像数据
- (void)setImageData:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;
/// 替换asset中的视频数据
- (void)setVideoAtPath:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock;
ALAssetRepresentation (asset详细信息,但不是asset的子类)
/// 返回UTI
- (NSString *)UTI;
/// 图片尺寸
- (CGSize)dimensions;
/// 文件大小
- (long long)size;
/// 将指定的buffer复制到缓冲区中
- (NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error;
/// 返回asset的cgimage类型(完整分辨率,理解为大图)
- (CGImageRef)fullResolutionImage;
- (CGImageRef)CGImageWithOptions:(NSDictionary *)options;
/// 返回适合全屏表示的cgimage
- (CGImageRef)fullScreenImage;
/// 唯一标识URL
- (NSURL *)url;
/// metadata类型的dic.如果系统无法识别则返回nil
- (NSDictionary *)metadata;
/// 方向
- (ALAssetOrientation)orientation;
/// 尺寸
- (float)scale;
/// 文件名
- (NSString *)filename;
ALAssetsFilter (asset类型)
/// 图片
+ (ALAssetsFilter *)allPhotos;
/// 视频
+ (ALAssetsFilter *)allVideos;
/// 所有asset(包括上面两种)
+ (ALAssetsFilter *)allAssets;
简单的示例
像相册写入一张图片
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"jpg"]];
[assetsLibrary writeImageToSavedPhotosAlbum:image.CGImage orientation:ALAssetOrientationUp completionBlock:^(NSURL *assetURL, NSError *error) {
}];
新建一个相册
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary addAssetsGroupAlbumWithName:@"test---" resultBlock:^(ALAssetsGroup *group) {
} failureBlock:^(NSError *error) {
}];
便利相册中的asset
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
[group setAssetsFilter:[ALAssetsFilter allAssets]];
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
ALAssetRepresentation *representation = [result defaultRepresentation];
NSURL *url = [representation url];
NSLog(@"url: %@", url);
}];
} failureBlock:^(NSError *error) {
NSLog(@"error :%@" ,error);
}];