问题描述
系统要求:无
设备要求:无
问题详情:用户禁止应用访问相册,但应用仍然调用了-[PHImageManager defaultManager]
方法,当应用出现内存警告时,就会崩溃。
崩溃信息
这个问题的崩溃日志:
问题关键信息:
This application is not allowed to access Photo data.
复现方法
1.创建一个新工程,添加相册读取权限Privacy - Photo Library Usage Description
。
2.在ViewDidLoad
的时候调用 -[PHImageManager defaultManager]
。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[PHImageManager defaultManager];
}
- 运行工程,在申请相册访问权限时点 Don't Allow。
- 模拟内存警告,工具栏点
Debug
->Simulate Memory Warning
,就会崩溃。
原因分析
PHImageManager
在初始化的时候添加DISPATCH_SOURCE_TYPE_MEMORYPRESSURE
事件通知,当内存不够的时候会尝试移除缓存。PHImageManager 是一个懒加载的对象,你如果曾经调用过 -[PHImageManager defaultManager]
隐式初始化,而且没获得相册权限,就会导致 crash。
解决方案
读取相册前先判断相册权限:
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
switch (status) {
case PHAuthorizationStatusAuthorized:
// 可以读取相册
break;
case PHAuthorizationStatusNotDetermined:
// 执行获取权限操作
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized) {
// 可以读取相册
} else {
// 提示在设置中打开相册访问权限
}
}];
break;
case PHAuthorizationStatusDenied:
// 提示在设置中打开相册访问权限
break;
case PHAuthorizationStatusRestricted:
// 提示访问相册受到限制,比如家长控制
break;
default:
break;
}
确保拥有相册权限才读取相册图片,尤其是调用-[PHImageManager defaultManager]
。
另外打开设置中当前应用设置的方法如下:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];