//此方法在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 //包含所有类型 }