//此方法在ios8.0系統上,之前用代碼創建的相冊,手動刪除它,再用這個庫去創建剛被刪除的相冊,這個時候方法回調是不會跑fail模塊的,它走的是正常流程,但是帶回來的group卻是nil造成崩潰原因 ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; [assetsLibrary addAssetsGroupAlbumWithName:@"iOSDevTip1" resultBlock:^(ALAssetsGroup *group12) { [groups addObject:group12]; } failureBlock:nil];
//為了解決iOS8.0以上系統下無法通過代碼創建被刪除過的同名相冊 [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^ { [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"琳小兮"]; } completionHandler:^(BOOL success, NSError *error) { if (!success) { NSLog(@"---error:%@",error.userInfo); } }];
補充
#pragma mark ----- 攝像頭和相冊相關 ----- // 判斷設備是否有攝像頭 - (BOOL)isCameraAvailable { return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; } // 判斷前面的攝像頭是否可用 - (BOOL)isFrontCameraAvailable { return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]; } // 判斷後面的攝像頭是否可用 - (BOOL)isRearCameraAvailable { return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]; } // 判斷是否支持某種多媒體類型:拍照片、拍視頻 - (BOOL)cameraSupportsMedia:(NSString *)paramMediaType sourceType:(UIImagePickerControllerSourceType)paramSourceType { __block BOOL result = NO; if ([paramMediaType length] == 0){ NSLog(@"Media type is empty."); return NO; } NSArray *availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:paramSourceType]; [availableMediaTypes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL*stop) { NSString *mediaType = (NSString *)obj; if ([mediaType isEqualToString:paramMediaType]){ result = YES; *stop = YES; } }]; return result; } // 判斷攝像頭是否支持錄像 - (BOOL)doesCameraSupportShootingVideos { return [self cameraSupportsMedia:(NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypeCamera]; } // 判斷攝像頭是否支持拍照 - (BOOL)doesCameraSupportTakingPhotos { return [self cameraSupportsMedia:(NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypeCamera]; } #pragma mark ----- 相冊文件選取相關 ----- // 判斷相冊是否可用 - (BOOL) isPhotoLibraryAvailable{ return [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary]; } // 判斷是否可以在相冊中選擇視頻 - (BOOL) canUserPickVideosFromPhotoLibrary { return [self cameraSupportsMedia:( NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypePhotoLibrary]; } // 判斷是否可以在相冊中選擇照片 - (BOOL) canUserPickPhotosFromPhotoLibrary { return [self cameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypePhotoLibrary]; }
------------------------------------- 2017.01.10補充 ----------------------------------
enum PHAssetCollectionType : Int { case Album //從 iTunes 同步來的相冊,以及用戶在 Photos 中自己建立的相冊 case SmartAlbum //經由相機得來的相冊 case Moment //Photos 為我們自動生成的時間分組的相冊 } enum PHAssetCollectionSubtype : Int { case AlbumRegular //用戶在 Photos 中創建的相冊,也就是我所謂的邏輯相冊 case AlbumSyncedEvent //使用 iTunes 從 Photos 照片庫或者 iPhoto 照片庫同步過來的事件。然而,在iTunes 12 以及iOS 9.0 beta4上,選用該類型沒法獲取同步的事件相冊,而必須使用AlbumSyncedAlbum。 case AlbumSyncedFaces //使用 iTunes 從 Photos 照片庫或者 iPhoto 照片庫同步的人物相冊。 case AlbumSyncedAlbum //做了 AlbumSyncedEvent 應該做的事 case AlbumImported //從相機或是外部存儲導入的相冊,完全沒有這方面的使用經驗,沒法驗證。 case AlbumMyPhotoStream //用戶的 iCloud 照片流 case AlbumCloudShared //用戶使用 iCloud 共享的相冊 case SmartAlbumGeneric //文檔解釋為非特殊類型的相冊,主要包括從 iPhoto 同步過來的相冊。由於本人的 iPhoto 已被 Photos 替代,無法驗證。不過,在我的 iPad mini 上是無法獲取的,而下面類型的相冊,盡管沒有包含照片或視頻,但能夠獲取到。 case SmartAlbumPanoramas //相機拍攝的全景照片 case SmartAlbumVideos //相機拍攝的視頻 case SmartAlbumFavorites //收藏文件夾 case SmartAlbumTimelapses //延時視頻文件夾,同時也會出現在視頻文件夾中 case SmartAlbumAllHidden //包含隱藏照片或視頻的文件夾 case SmartAlbumRecentlyAdded //相機近期拍攝的照片或視頻 case SmartAlbumBursts //連拍模式拍攝的照片,在 iPad mini 上按住快門不放就可以了,但是照片依然沒有存放在這個文件夾下,而是在相機相冊裡。 case SmartAlbumSlomoVideos //Slomo 是 slow motion 的縮寫,高速攝影慢動作解析,在該模式下,iOS 設備以120幀拍攝。不過我的 iPad mini 不支持,沒法驗證。 case SmartAlbumUserLibrary //這個命名最神奇了,就是相機相冊,所有相機拍攝的照片或視頻都會出現在該相冊中,而且使用其他應用保存的照片也會出現在這裡。 case Any //包含所有類型 }