iOS 개발 의 AssetsLibrary 프레임 워 크 사용 에 대한 자세 한 설명

12328 단어 iOSAssetsLibrary
머리말
AssetsLibrary 프레임 워 크 는 앨범 관련 자원 을 전문 적 으로 조작 하 는 프레임 워 크 로 iOS 4 에서 iOS 9 사이 에 자주 사용 되 는 프레임 워 크 이다.iOS 9 이후 시스템 은 Photos 프레임 워 크 를 AssetsLibrary 프레임 워 크 를 대 체 했 지만 AssetsLibrary 프레임 워 크 는 여전히 사용 할 수 있 고 그 구조 와 디자인 방향 은 우리 가 분석 하고 학습 할 가치 가 있다.
개술
AssetsLibrary 프레임 워 크 는 시스템 의 앨범 을 운영 하기 때문에 먼저 권한 신청 이 필요 합 니 다.사용 하기 전에 먼저 Info.plist 파일 에 다음 키 를 추가 해 야 합 니 다.
Privacy - Photo Library Usage Description
AssetsLibrary 프레임 워 크 의 핵심 클래스 관 계 는 다음 그림 과 같다.

1.ALAssetsLibrary:전체 장치 의 사진 과 동 영상 을 대표 하고 ALAssetsLibrary 를 통 해 장치 의 사진 과 동 영상 을 가 져 올 수 있 습 니 다.
2.ALAssetsGroup:사진 라 이브 러 리 에 있 는 앨범 을 매 핑 합 니 다.ALAssetsGroup 을 통 해 특정한 앨범 의 정보,앨범 에 있 는 사진 과 동 영상 을 얻 을 수 있 고 특정한 앨범 에 자원 을 추가 할 수 있 습 니 다.
3.ALAsset:앨범 에 있 는 사진 이나 동 영상 을 매 핑 하고 ALAsset 를 통 해 특정한 사진 이나 동 영상 에 대한 상세 한 정 보 를 얻 고 사진 과 동 영상 을 저장 할 수 있 습 니 다.
4.ALAssetRepresentation:ALAssetRepresentation 은 ALAsset 에 대한 패키지(하위 클래스 는 아 님)로 ALAsset 의 자원 정 보 를 더욱 편리 하 게 얻 을 수 있 습 니 다.ALAsset 마다 최소 하나의 ALAssetRepresentation 대상 이 있 고 default5.ALAssetsFilter:필터 에 해당 하 는 세 가지 방법 이 있 습 니 다.allPhotos:앨범 에 있 는 모든 사진 을 가 져 옵 니 다.allVideos:앨범 에 있 는 모든 동 영상 을 가 져 옵 니 다.allAssets:사진 라 이브 러 리 에 있 는 앨범 을 가 져 옵 니 다.ALAssets Group 클래스 의 setAssetsFilter 를 통 해 호출 합 니 다.
3.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(@"  ");
  }];
위 예제 의 매 거 진 함 수 는 매개 변수 유형 에 따라 자원 그룹 을 가 져 오 는 데 사 용 됩 니 다.ALAssetsGroup Type 매개 변 수 는 그룹 을 가 져 오 는 유형 을 결정 합 니 다.선택 할 수 있 는 값 은 다음 과 같 습 니 다.

enum {
  ALAssetsGroupLibrary   ,//    
  ALAssetsGroupAlbum    ,//   
  ALAssetsGroupEvent    ,//    
  ALAssetsGroupFaces    ,// iTunes  
  ALAssetsGroupSavedPhotos ,//      
  ALAssetsGroupPhotoStream ,// The PhotoStream album.
  ALAssetsGroupAll     ,//   
};
매 거 과정 에서 저 희 는 과거 에 ALAssets Group 유형의 대상 에 갈 수 있 습 니 다.이 대상 에 사진 자원 정 보 를 봉 인 했 고 나중에 소개 할 것 입 니 다.
다음은 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;
다음은 조작 과정 에서 의 이상 정 의 를 열거 합 니 다.

enum {
  ALAssetsLibraryUnknownError =         -1,   //     
  ALAssetsLibraryWriteFailedError =      -3300,   //    
  ALAssetsLibraryWriteBusyError =       -3301,   //          
  ALAssetsLibraryWriteInvalidDataError =   -3302,   //     
  ALAssetsLibraryWriteIncompatibleDataError = -3303,   //       
  ALAssetsLibraryWriteDataEncodingError =   -3304,   //       
  ALAssetsLibraryWriteDiskSpaceError =    -3305,   //     
  ALAssetsLibraryDataUnavailableError =    -3310,   //      
  ALAssetsLibraryAccessUserDeniedError =   -3311,   //     
  ALAssetsLibraryAccessGloballyDeniedError = -3312,   //     
};
4.ALAssets Group 자원 그룹 대상
자원 그룹 은 사실 우리 앨범 과 대응 하 는 자원 입 니 다.우 리 는 다음 과 같은 편 의 를 통 해 그 중의 모든 자원 을 옮 겨 다 닐 수 있 습 니 다.

  _library = [[ALAssetsLibrary alloc]init];
  [_library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    if (group) { //         
      //      
      [group setAssetsFilter:[ALAssetsFilter allPhotos]];
      if (group.numberOfAssets) {
        [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
          NSLog(@"%d:%@",index,result);
        }];
      }
    } else { //     ( group           )

        NSLog(@"       ");
    }

  } failureBlock:^(NSError *error) {
    NSLog(@"  ");
  }];

ALAssets Group 의 관련 방법 은 다음 과 같 습 니 다.

//      
/*
extern NSString *const ALAssetsGroupPropertyName;//   
extern NSString *const ALAssetsGroupPropertyType;//   
extern NSString *const ALAssetsGroupPropertyPersistentID; //ID
extern NSString *const ALAssetsGroupPropertyURL;// URL
*/
- (id)valueForProperty:(NSString *)property;
//           
- (CGImageRef)posterImage;
//     
- (void)setAssetsFilter:(ALAssetsFilter *)filter;
//        
- (NSInteger)numberOfAssets;
//      
- (void)enumerateAssetsUsingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock;
/*
typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) {
  NSEnumerationConcurrent = (1UL << 0),//    
  NSEnumerationReverse = (1UL << 1),  //    
};
*/
- (void)enumerateAssetsWithOptions:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock;
- (void)enumerateAssetsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock;
//           
@property (nonatomic, readonly, getter=isEditable) BOOL editable;
//         
- (BOOL)addAsset:(ALAsset *)asset;
위 에서 언급 한 자원 필터,자원 필 터 는 필터 그룹의 자원 을 설정 하 는 데 사 용 됩 니 다.시스템 이 제공 하 는 필 터 를 직접 가 져 올 수 있 는 세 가지 방법 이 있 습 니 다.

@interface ALAssetsFilter : NSObject {
//      
+ (ALAssetsFilter *)allPhotos;
//       
+ (ALAssetsFilter *)allVideos;
//     
+ (ALAssetsFilter *)allAssets;
@end
5.ALAsset 자원 대상
ALAsset 는 봉 인 된 자원 대상 클래스 로 다음 과 같은 방법 으로 자원 에 봉 인 된 속성 을 얻 을 수 있 습 니 다.

- (id)valueForProperty:(NSString *)property;
속성 이름 의 정 의 는 다음 과 같 습 니 다.

//      
/*
            
extern NSString *const ALAssetTypePhoto//    
extern NSString *const ALAssetTypeVideo//    
extern NSString *const ALAssetTypeUnknown//    
*/
extern NSString *const ALAssetPropertyType;
//     CLLocation          
extern NSString *const ALAssetPropertyLocation;
//        NSNumber  
extern NSString *const ALAssetPropertyDuration;
//    
extern NSString *const ALAssetPropertyOrientation;
//        NSDate  
extern NSString *const ALAssetPropertyDate;
다음은 ALAsset 에서 자주 사용 하 는 방법 을 열거 했다.

//     Representation  
- (ALAssetRepresentation *)defaultRepresentation;
//     Representation  
- (ALAssetRepresentation *)representationForUTI:(NSString *)representationUTI;
//       
- (CGImageRef)thumbnail;
- (CGImageRef)aspectRatioThumbnail;
//      
- (void)writeModifiedImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;
//      
- (void)writeModifiedVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock;
//      
@property (nonatomic, readonly) ALAsset *originalAsset;
//      
@property (nonatomic, readonly, getter=isEditable) BOOL editable;
//      
- (void)setImageData:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;
//      
- (void)setVideoAtPath:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock;
6.ALAsset Representation 류 에 대하 여
모든 ALAsset 대상 에 하나의 ALAsset Representation 대상 이 봉인 되 어 있 습 니 다.이 대상 의 역할 은 자원 에 대한 상세 한 정 보 를 얻 는 것 입 니 다.다음 과 같이 해석 합 니 다.

//  UTI
- (NSString *)UTI;
//       
- (CGSize)dimensions;
//       
- (long long)size;
//    
- (NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error;
//      
- (CGImageRef)fullResolutionImage;
- (CGImageRef)CGImageWithOptions:(NSDictionary *)options;
//      
- (CGImageRef)fullScreenImage;
//    URL
- (NSURL *)url;
//       
- (NSDictionary *)metadata;
//      
- (ALAssetOrientation)orientation;
//   
- (float)scale;
//      
- (NSString *)filename;
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기