iOS7,8,9下相册适配AssetsLibrary和Photos框架

1.0 简介

iOS8及以后苹果将操作相册的ALAssetsLibrary framework替换为Photos framework,在iOS9中废弃了原ALAssetsLibrary框架。 所以,如果应用支持7,8,9需要针对相册做不同版本的适配。

1.1 AssetsLibrary 简介

AssetsLibrary 的组成比较符合照片库本身的组成,照片库中的完整照片库对象、 相册、相片都能在 AssetsLibrary 中找到一一对应的组成,这使到 AssetsLibrary 的使用变得直观而方便。
AssetsLibrary: 代表整个设备中的资源库(照片库),通过 AssetsLibrary 可以获取和包括设备中的照片和视频
ALAssetsGroup: 映射照片库中的一个相册,通过 ALAssetsGroup 可以获取某个相册的信息,相册下的资源,同时也可以对某个相册添加资源。
ALAsset: 映射照片库中的一个照片或视频,通过 ALAsset 可以获取某个照片或视频的详细信息,或者保存照片和视频。
ALAssetRepresentation: ALAssetRepresentation 是对 ALAsset 的封装(但不是其子类),可以更方便地获取 ALAsset 中的资源信息,每个 ALAsset 都有至少有一个 ALAssetRepresentation 对象,可以通过 defaultRepresentation 获取。而例如使用系统相机应用拍摄的 RAW + JPEG 照片,则会有两个 ALAssetRepresentation,一个封装了照片的 RAW 信息,另一个则封装了照片的 JPEG 信息。

1.2 PhotoKit 简介

PhotoKit 是一套比 AssetsLibrary 更完整也更高效的库,对资源的处理跟 AssetsLibrary 也有很大的不同。
首先简单介绍几个概念:
PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源
PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值
PHFetchResult: 表示一系列的资源集合
PHAssetCollection: 表示一个相册或者一个时刻
PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格
PHImageRequestOptions: 如上面所说,控制加载图片时的一系列参数

2.0 适配器模式进行适配

对于两个类所做的事情相同,但是具有不同接口的时候,适配器模式是一个很好的选择。

2.1适配单个资源(如图片,视频等单个资源).h文件

 //  LovePHAssetModel.h
 //  适配对应PHAsset和ALAsset
 //  Created by 李晓光 on 16/7/27.
 //  Copyright © 2016年 Discoverybay. All rights reserved.
 //

 #import <Foundation/Foundation.h>
 /**
  *  资源媒体类型枚举,与PHAssetMediaType相对应
  */
 typedef enum{
     LovePHAssetMediaTypeUnknown = 0,
     LovePHAssetMediaTypeImage   = 1,
     LovePHAssetMediaTypeVideo   = 2,
     LovePHAssetMediaTypeAudio   = 3,
 }LovePHAssetMediaType;
 /**
  *  上传资源压缩类型枚举,默认高清
  */
 typedef enum{
     //默认
     LoveUploadCompressTypeDefault = 0,
     //原图
     LoveUploadCompressTypeOrigin   = 1,
 }LoveUploadCompressType;
 @class PHAsset;
 @class ALAsset;
 @interface LovePHAssetModel : NSObject
 /**
  *  上传资源压缩类型
  */
 @property (nonatomic, assign)LoveUploadCompressType compressType;
 /**
  *  媒体资源类型
  */
 @property (nonatomic, assign)LovePHAssetMediaType mediaType;
 /**
  *  资源的创建时间
  */
 @property (nonatomic, strong)NSDate *creationDate;
 /**
  *  资源的时长
  */
 @property (nonatomic, assign)NSTimeInterval duration;
 /**
  *  资源大小
  */
 @property (nonatomic, assign)long long assetSize;
 /**
  *  Photos下对象
  */
 @property (nonatomic,strong)PHAsset *phAsset;
 /**
  *  AssetsLibrary下对象
  */
 @property (nonatomic,strong)ALAsset *alAsset;

 /**
  *  同步获取缩略图
  *
  *  @param resultHandler 图片
  *  @param photoWidth 照片宽度
  *  @return 信息
  */
 - (void)get_synchronousThumbnailImageWithPhotoWidth:(CGFloat)photoWidth resultHandler:(void (^)(UIImage * result, NSDictionary * info))resultHandler;
 /**
  *  异步获取缩略图
  *
  *  @param resultHandler 图片
  *  @param photoWidth 照片宽度
  *  @return 信息
  */
 - (void)get_asynchronousThumbnailImageWithPhotoWidth:(CGFloat)photoWidth resultHandler:(void (^)(UIImage * result, NSDictionary * info))resultHandler;
 /**
  *  同步获取原图
  *
  *  @param resultHandler 图片
  *
  *  @return 信息
  */
 - (void)get_synchronousOriginImageForResultHandler:(void (^)(UIImage * result, NSDictionary * info))resultHandler;
 /**
  *  异步获取原图
  *
  *  @param resultHandler 图片
  *
  *  @return 信息
  */
 - (void)get_asynchronousOriginImageForResultHandler:(void (^)(UIImage * result, NSDictionary * info))resultHandler;
 /**
  *  获取资源图片的长宽
  *
  */
 - (CGSize)getDimension;

 /**
  *  获取原图data数据
  */
 - (NSData *)getOriginData;
 @end

2.2适配单个相册资源.h文件

ALAssetsLibrary框架下用ALAssetsGroup ,Photos下用PHAssetCollection与PHFetchResult组合表示

//  LovePHAssetCollectionModel.h
//  功能:适配对应PHAssetCollection和ALAssetsGroup
//  Created by 李晓光 on 16/7/26.
//  Copyright © 2016年 Discoverybay. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "LovePHAssetModel.h"
@class PHAssetCollection;
@class ALAssetsGroup;
@class PHFetchResult;
@interface LovePHAssetCollectionModel : NSObject
/**
  *  资源数量
 */
@property (nonatomic, assign) NSUInteger estimatedAssetCount;
  /**
 *  相册标题
 */
@property (nonatomic, copy) NSString *localizedTitle;

/**
 *  Photos下对象
 */
@property (nonatomic, strong) PHAssetCollection *phAssetCollection;
 /**
 *  资源结果集合
 */
@property (nonatomic, strong) PHFetchResult *fetchResultAssets;
/**
 *  AssetsLibrary下对象
 */
@property (nonatomic, strong) ALAssetsGroup *alAssetsGroup;

/**
 *  获取封面图片
 */
- (UIImage *)getAlbumCoverPhoto;

/**
 *  获取单个资源
 *
 *  @param assetBlock 单个资源模型回调
 */
  - (void)getPHAssetModelForAssetBlock:(void (^)(LovePHAssetModel *phAssetModel))assetBlock;

@end

2.3获取相册资源列表.h文件

//  LovePHAssetCollectionManager.h
//  功能:获取相册资源列表
//  Created by 李晓光 on 16/7/26.
//  Copyright © 2016年 Discoverybay. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "LovePHAssetCollectionModel.h"
#import <Photos/Photos.h>
@interface LovePHAssetCollectionManager : NSObject

+ (instancetype)sharedManager;
/**
 *  获取相册资源
 *  @param mediaType  媒体资源类型
 *  @param assetBlock 相册资源模型回调
 *  @param failure    失败回调
 */
  - (void)getAlbumPHAssetCollectionModelWithMediaType:(PHAssetMediaType)mediaType assetBlock:(void (^)(LovePHAssetCollectionModel *phAssetCollectionModel))assetBlock failure:(void (^)(NSError *error))failure;

@end

2.4获取相册资源列表.m文件

//  LovePHAssetCollectionManager.m
//  功能:本地相册适配
//  Created by 李晓光 on 16/7/26.
//  Copyright © 2016年 Discoverybay. All rights reserved.
//

#import "LovePHAssetCollectionManager.h"
#import <AssetsLibrary/AssetsLibrary.h>
#import "GlobalUtils.h"
@interface LovePHAssetCollectionManager()
//
@property (nonatomic, strong)NSArray *assetCollectionSubtypes;
@end
@implementation LovePHAssetCollectionManager
//
+ (ALAssetsLibrary *)defaultAssetsLibrary
{
static dispatch_once_t pred = 0;
static ALAssetsLibrary *library = nil;
dispatch_once(&pred, ^{
    library = [[ALAssetsLibrary alloc] init];
});
return library;
}

//
+ (instancetype)sharedManager
{
static LovePHAssetCollectionManager *sharedManager = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
    sharedManager = [[LovePHAssetCollectionManager alloc] init];
});
return sharedManager;
}

//
- (void)getAlbumPHAssetCollectionModelWithMediaType:(PHAssetMediaType)mediaType assetBlock:(void (^)(LovePHAssetCollectionModel *phAssetCollectionModel))assetBlock failure:(void (^)(NSError *error))failure;
{
if (isIOS8){
    PHAuthorizationStatus author = [PHPhotoLibrary authorizationStatus];
    
    if(author == PHAuthorizationStatusRestricted || author == PHAuthorizationStatusDenied){
        failure([NSError errorWithDomain:@"无权限" code:PHAuthorizationStatusRestricted userInfo:nil]);
        //无权限
        
    }else{
        //
        PHFetchOptions *option  = [[PHFetchOptions alloc] init];
        if (isIOS9) {
            option.includeAssetSourceTypes = PHAssetSourceTypeUserLibrary;
        }
        if (mediaType != PHAssetMediaTypeUnknown) {
            option.predicate = [NSPredicate predicateWithFormat:@"mediaType = %d", mediaType];
            //
        }
        /*
        PHAssetCollectionSubtypeSmartAlbumGeneric    = 200,
        PHAssetCollectionSubtypeSmartAlbumPanoramas  = 201,
        PHAssetCollectionSubtypeSmartAlbumVideos     = 202,
        PHAssetCollectionSubtypeSmartAlbumFavorites  = 203,
        PHAssetCollectionSubtypeSmartAlbumTimelapses = 204,
        PHAssetCollectionSubtypeSmartAlbumAllHidden  = 205,
        PHAssetCollectionSubtypeSmartAlbumRecentlyAdded = 206,
        PHAssetCollectionSubtypeSmartAlbumBursts     = 207,
        PHAssetCollectionSubtypeSmartAlbumSlomoVideos = 208,
        PHAssetCollectionSubtypeSmartAlbumUserLibrary = 209,
         */
        PHAssetCollectionSubtype smartAlbumSubtype = PHAssetCollectionSubtypeSmartAlbumGeneric | PHAssetCollectionSubtypeSmartAlbumPanoramas | PHAssetCollectionSubtypeSmartAlbumVideos | PHAssetCollectionSubtypeSmartAlbumFavorites|PHAssetCollectionSubtypeSmartAlbumTimelapses|PHAssetCollectionSubtypeSmartAlbumAllHidden|PHAssetCollectionSubtypeSmartAlbumRecentlyAdded|PHAssetCollectionSubtypeSmartAlbumBursts|PHAssetCollectionSubtypeSmartAlbumSlomoVideos|PHAssetCollectionSubtypeSmartAlbumUserLibrary;

        if (isIOS9) {
            smartAlbumSubtype = PHAssetCollectionSubtypeSmartAlbumGeneric | PHAssetCollectionSubtypeSmartAlbumPanoramas | PHAssetCollectionSubtypeSmartAlbumVideos | PHAssetCollectionSubtypeSmartAlbumFavorites|PHAssetCollectionSubtypeSmartAlbumTimelapses|PHAssetCollectionSubtypeSmartAlbumAllHidden|PHAssetCollectionSubtypeSmartAlbumRecentlyAdded|PHAssetCollectionSubtypeSmartAlbumBursts|PHAssetCollectionSubtypeSmartAlbumSlomoVideos|PHAssetCollectionSubtypeSmartAlbumUserLibrary|PHAssetCollectionSubtypeSmartAlbumSelfPortraits|PHAssetCollectionSubtypeSmartAlbumScreenshots;
        }
        PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:smartAlbumSubtype options:nil];
        
        for (PHAssetCollection *assetCollection in smartAlbums) {
            
            PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:option];
            LovePHAssetCollectionModel *model = [[LovePHAssetCollectionModel alloc] init];
            model.phAssetCollection = assetCollection;
            model.fetchResultAssets = fetchResult;
            
         
            assetBlock(model);
 
            
        }

        PHFetchResult *albums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular | PHAssetCollectionSubtypeAlbumSyncedAlbum|PHAssetCollectionSubtypeAlbumSyncedFaces options:nil];
        for (PHAssetCollection *assetCollection in albums) {
            PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:option];
         
            
            LovePHAssetCollectionModel *model = [[LovePHAssetCollectionModel alloc] init];
            model.phAssetCollection = assetCollection;
            model.fetchResultAssets = fetchResult;
            
            
            assetBlock(model);
     
        }
        
        
        //结束
        assetBlock(nil);
        

    }

}else{
    
    
    
    
    ALAssetsLibraryGroupsEnumerationResultsBlock resultsBlock = ^(ALAssetsGroup *group, BOOL *stop) {
        
        if (group)
        {
            switch (mediaType) {
                case PHAssetMediaTypeImage:{
                    [group setAssetsFilter:[ALAssetsFilter allPhotos]];
                    break;
                }
                case PHAssetMediaTypeVideo:{
                    [group setAssetsFilter:[ALAssetsFilter allVideos]];
                    break;
                }
                default:{
                    [group setAssetsFilter:[ALAssetsFilter allAssets]];
                    break;
                }
            }
            
            LovePHAssetCollectionModel *model = [[LovePHAssetCollectionModel alloc] init];
            model.alAssetsGroup = group;
            assetBlock(model);
            
            
        }else{
            assetBlock(nil);
        }
   
    };
    
    
    ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {
        failure(error);

        
    };
    
    // Enumerate Camera roll first
    [[LovePHAssetCollectionManager defaultAssetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                                                                       usingBlock:resultsBlock
                                                                     failureBlock:failureBlock];

    NSUInteger type =
    ALAssetsGroupLibrary | ALAssetsGroupAlbum | ALAssetsGroupEvent |
    ALAssetsGroupFaces | ALAssetsGroupPhotoStream;
    
    [[LovePHAssetCollectionManager defaultAssetsLibrary] enumerateGroupsWithTypes:type
                                                                       usingBlock:resultsBlock
                                                                     failureBlock:failureBlock];
    

    
    
    }
}

@end

2.5适配单个相册资源.m文件

//  LovePHAssetCollectionModel.m
//  功能:适配对应PHAssetCollection和ALAssetsGroup
//  Created by 李晓光 on 16/7/26.
//  Copyright © 2016年 Discoverybay. All rights reserved.
//

#import "LovePHAssetCollectionModel.h"
#import <Photos/Photos.h>
#import <AssetsLibrary/AssetsLibrary.h>
@interface LovePHAssetCollectionModel()

@end
@implementation LovePHAssetCollectionModel
#pragma mark - ALAssetsLibrary


- (UIImage *)getAlbumCoverPhoto{
UIImage *coverImage = nil;
if (_phAssetCollection) {
 
        PHFetchResult *groupResult = [PHAsset fetchAssetsInAssetCollection:self.phAssetCollection options:nil];
        PHAsset *asset = groupResult.lastObject;
        PHImageRequestOptions *requestOptions = [[PHImageRequestOptions alloc] init];
        requestOptions.resizeMode = PHImageRequestOptionsResizeModeExact;
        
        CGFloat scale = [UIScreen mainScreen].scale;
        CGFloat dimension = 120.0f;
        CGSize size = CGSizeMake(dimension * scale, dimension * scale);
        __block UIImage *resultImage = nil;
        [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFill options:requestOptions resultHandler:^(UIImage *result, NSDictionary *info) {
            resultImage = result;
        }];
        coverImage = resultImage;


}else if(_alAssetsGroup){
    
        CGImageRef posterImage      = _alAssetsGroup.posterImage;
        size_t height               = CGImageGetHeight(posterImage);
        float scale                 = height / 65;
    
    coverImage = [UIImage imageWithCGImage:posterImage scale:scale orientation:UIImageOrientationUp];
    
}
return coverImage;
}
-(NSUInteger)estimatedAssetCount
{
if (_estimatedAssetCount == 0) {
    if (_phAssetCollection) {
        if (_fetchResultAssets) {
            _estimatedAssetCount = [_fetchResultAssets count];
        }else{
            _estimatedAssetCount = _phAssetCollection.estimatedAssetCount;
        }
        
    }else if(_alAssetsGroup){
        _estimatedAssetCount = [_alAssetsGroup numberOfAssets];
    }
    
}
return _estimatedAssetCount;
}
//
-(NSString *)localizedTitle
{
if (!_localizedTitle) {
    if (_phAssetCollection) {
        _localizedTitle = _phAssetCollection.localizedTitle;
        
    }else if(_alAssetsGroup){
        _localizedTitle = [_alAssetsGroup valueForProperty:ALAssetsGroupPropertyName];
    }
}
return _localizedTitle;
}
//

- (void)getPHAssetModelForAssetBlock:(void (^)(LovePHAssetModel *phAssetModel))assetBlock
{

if (_phAssetCollection) {
    if (_fetchResultAssets) {
        for (PHAsset *asset in _fetchResultAssets) {
            
            LovePHAssetModel *phAssetModel = [[LovePHAssetModel alloc] init];
            phAssetModel.phAsset = asset;
            phAssetModel.mediaType = asset.mediaType;
            assetBlock(phAssetModel);
            
        }
    }else{
        
        PHFetchResult<PHAsset *> *assets = [PHAsset fetchKeyAssetsInAssetCollection:_phAssetCollection options:nil];
        for (PHAsset *asset in assets) {
            
            LovePHAssetModel *phAssetModel = [[LovePHAssetModel alloc] init];
            phAssetModel.phAsset = asset;
            phAssetModel.mediaType = asset.mediaType;
            assetBlock(phAssetModel);
            
        }
        _fetchResultAssets = assets;
        
    }
    //结束
    assetBlock(nil);

}else if(_alAssetsGroup){
  
    ALAssetsGroupEnumerationResultsBlock resultsBlock = ^(ALAsset *asset, NSUInteger index, BOOL *stop) {
        
        if (asset)
        {
            LovePHAssetModel *phAssetModel = [[LovePHAssetModel alloc] init];
            phAssetModel.alAsset = asset;

            
            NSString *type = [asset valueForProperty:ALAssetPropertyType];
            
            if ([type isEqual:ALAssetTypePhoto]){
                phAssetModel.mediaType = LovePHAssetMediaTypeImage;
                
            }else if ([type isEqual:ALAssetTypeVideo]){
                phAssetModel.mediaType = LovePHAssetMediaTypeVideo;
            }
            assetBlock(phAssetModel);
            
        }else{
            assetBlock(nil);
        }
        
     
    };
    
    [self.alAssetsGroup enumerateAssetsUsingBlock:resultsBlock];
}
}
//
@end

2.6适配单个资源(如图片,视频等单个资源).m文件

//
//  LovePHAssetModel.m
//  适配对应PHAsset和ALAsset
//  Created by 李晓光 on 16/7/27.
//  Copyright © 2016年 Discoverybay. All rights reserved.
//

#import "LovePHAssetModel.h"
#import <Photos/Photos.h>
#import <AssetsLibrary/AssetsLibrary.h>
@interface LovePHAssetModel()
@end
@implementation LovePHAssetModel
#pragma mark ================缩略图===============
- (void)get_asynchronousThumbnailImageWithPhotoWidth:(CGFloat)photoWidth resultHandler:(void (^)(UIImage * result, NSDictionary * info))resultHandler
{
[self getThumbnailImageIsSynchronous:NO photoWidth:photoWidth ResultHandler:resultHandler];
}
- (void)get_synchronousThumbnailImageWithPhotoWidth:(CGFloat)photoWidth resultHandler:(void (^)(UIImage * result, NSDictionary * info))resultHandler
{
[self getThumbnailImageIsSynchronous:YES photoWidth:photoWidth ResultHandler:resultHandler];
}

- (void)getThumbnailImageIsSynchronous:(BOOL)isSynchronous photoWidth:(CGFloat)photoWidth ResultHandler:(void (^)(UIImage * result, NSDictionary * info))resultHandler
{
if (_phAsset) {
    //
    PHImageRequestOptions *phImageRequestOptions = [[PHImageRequestOptions alloc] init];
    if (isSynchronous) {
        phImageRequestOptions.synchronous = YES;
    }else{
        phImageRequestOptions = nil;
    }
    
    CGFloat aspectRatio = _phAsset.pixelWidth / (CGFloat)_phAsset.pixelHeight;
    CGFloat multiple = [UIScreen mainScreen].scale;
    CGFloat pixelWidth = photoWidth * multiple;
    CGFloat pixelHeight = pixelWidth / aspectRatio;
    

    
    
    [[PHImageManager defaultManager] requestImageForAsset:_phAsset targetSize:CGSizeMake(pixelWidth, pixelHeight) contentMode:PHImageContentModeAspectFill options:phImageRequestOptions resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        resultHandler(result,info);
      
    }];
    
}else if (_alAsset){
    resultHandler([UIImage imageWithCGImage:_alAsset.thumbnail],nil);
}

}

#pragma mark ===============原图=========================
- (void)get_synchronousOriginImageForResultHandler:(void (^)(UIImage* result, NSDictionary * info))resultHandler
{
[self getOriginImageIsSynchronous:YES ResultHandler:resultHandler];
}
- (void)get_asynchronousOriginImageForResultHandler:(void (^)(UIImage *result, NSDictionary * info))resultHandler
{
[self getOriginImageIsSynchronous:NO ResultHandler:resultHandler];
}
- (void)getOriginImageIsSynchronous:(BOOL)isSynchronous ResultHandler:(void (^)(UIImage * result, NSDictionary * info))resultHandler
{
if (_phAsset) {

    PHImageRequestOptions *phImageRequestOptions = [[PHImageRequestOptions alloc] init];
    if (isSynchronous) {
        phImageRequestOptions.synchronous = YES;
    }else{
        phImageRequestOptions = nil;
    }
    [[PHImageManager defaultManager] requestImageForAsset:_phAsset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFill options:phImageRequestOptions resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        
        resultHandler(result,info);
    }];
    
}else if (_alAsset){
    ALAssetRepresentation *rep = [_alAsset defaultRepresentation];
    CGImageRef iref = [rep fullResolutionImage];
    if (iref) {
        resultHandler([UIImage imageWithCGImage:iref scale:[rep scale] orientation:[rep orientation]],nil);
    }else{
        
        resultHandler(nil,nil);
    }
}
}

/**
 *  获取资源的长宽size
 *
 */
- (CGSize)getDimension
{
CGSize size = CGSizeMake(0, 0);
if (_phAsset) {
    //
    size = CGSizeMake(_phAsset.pixelWidth, _phAsset.pixelHeight);
    
}else if(_alAsset){
    ALAssetRepresentation* representation = [_alAsset defaultRepresentation];
    size =  [representation dimensions];
}
return size;
}

/**
 *  获取资源容量大小
 *
 */
-(long long)assetSize
{
if (!_assetSize) {
    
    if (_phAsset) {
        //

        PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
        options.synchronous = YES;
        [[PHImageManager defaultManager] requestImageDataForAsset:_phAsset options:options resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
            _assetSize =  [(NSData *)info[@"PHImageFileDataKey"] length];
        }];
       
        
        
    }else if (_alAsset){
        
        ALAssetRepresentation* representation = [_alAsset defaultRepresentation];
        _assetSize = [representation size];
    }
    
    
}

return _assetSize;
}

/**
 *  获取原图data数据
 */
- (NSData *)getOriginData
{
__block NSData *data = nil;
if (_phAsset) {
    //
    PHImageRequestOptions *phImageRequestOptions = [[PHImageRequestOptions alloc] init];
    phImageRequestOptions.synchronous = YES;

    [[PHImageManager defaultManager] requestImageDataForAsset:_phAsset options:phImageRequestOptions resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
        data = imageData;
        
    }];
    
    
    
    
}else if (_alAsset){
    ALAssetRepresentation *rep = [_alAsset defaultRepresentation];
    //注意这里丢失了精度.不过目前来看不可能出现问题 size不可能到达long long的精度
    NSUInteger repSize = [rep size];
    uint8_t *buffer = malloc(sizeof(uint8_t) * repSize);
    if (!buffer) {
        //照片处理失败.不发送
        return nil;
    }
    NSError *error = nil;
    NSUInteger retV = [rep getBytes:buffer fromOffset:0 length:repSize error:&error];
    if (retV == 0 || error != nil) {
        //出错就返回.
        free(buffer);
        return nil;
    }
    data = [NSData dataWithBytes:buffer length:repSize];
    //销毁
    free(buffer);
}

return data;

}
-(NSTimeInterval)duration
{
if (!_duration) {
    if (_phAsset) {
        _duration = _phAsset.duration;
        
        
    }else if (_alAsset){
        _duration = [[_alAsset valueForProperty:ALAssetPropertyDuration] doubleValue];
    }
}

return _duration;
}
-(NSDate *)creationDate
{
if (!_creationDate) {
    if (_phAsset) {
        _creationDate = _phAsset.creationDate;
    }else if (_alAsset){
        _creationDate = [_alAsset valueForProperty:ALAssetPropertyDate];
    }
}

return _creationDate;
}
@end

3.0总结

1 在 AssetsLibrary 中,相册和资源是分别对应ALAssetGroup 和 ALAsset,能直接获取相关信息。 PhotoKit 则是通过PHFetchResult 筛选的资源合集。
2 本文适配的核心思想就是构建一个新类,AssetsLibrary,PhotoKit下操作所对应的类,分别为这个新类的属性。对新类定义统一接口进行相应逻辑操作。

关注微信公众号.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容