背景
iOS在14.0之后推出了新的相册权限“选中的照片”,这使得app只能选择授权“选中的照片”选中的图片。并且默认情况下,iOS的app在启动后首次调用相册时,会提示一个alert,让用户选择是否重新选择“选中的照片”,之后再调用相册时,就不会再弹出这个alert了。 这就导致如果用户想重新选择其他照片而无法选择了,并且在默认情况下弹出选择的alert后,去相册重新选择照片后,没有回调告知app,开发者无法在重新选择选中的照片后更新选择的图库,从而更新可供用户选择的照片。
引出问题
- 问题一:如何由开发者控制在“选中的照片”权限下,何时弹出相册选择照片?
- 问题二:如何在选择照片后回调告知app,让app可以更新图库,或做一些逻辑?
解决方案
1.导入iOS的PhotosUI.framework框架
2. 在info.plist文件中配置
在info.plist中设置PHPhotoLibraryPreventAutomaticLimitedAccessAlert并设置为YES,用户防止用户自动弹出是否重新选中照片的alert
3.实现主动弹出相册选择照片的接口
导入头文件
#import <PhotosUI/PHPhotoLibrary+PhotosUISupport.h>
调用相册,重新选中照片
[[PHPhotoLibrary sharedPhotoLibrary] presentLimitedLibraryPickerFromViewController:self];
4.实现重新选中照片后的回调
遵循协议
PHPhotoLibraryChangeObserver
实现协议方法
-(void)photoLibraryDidChange:(PHChange *)changeInstance{
//重新获取相册选中的照片
}
实现方法调用
[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];
在dealloc或合适的地方注销
[[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self];
iOS15.0以上还可以直接使用以下方法,通过block回调重新选中照片的结果
- (void)presentLimitedLibraryPickerFromViewController:(UIViewController *)controller completionHandler:(void(^)(NSArray<NSString *>*))completionHandler
遗留问题
思路严谨的读者可能会想到,该如何判断当前是“选中的照片”,还是“所有照片”呢,如果可以判断,就可以决定是否应该实现以上的逻辑了。很遗憾,作者暂时也不知道怎么判断,有知道的朋友可以赐教!不过可以确定的是本方的解决方案不判断也没有问题,测试过了的。