PhotoKit崩溃问题,This application is not allowed to access Photo data.

问题描述

系统要求:无
设备要求:无
问题详情:用户禁止应用访问相册,但应用仍然调用了-[PHImageManager defaultManager]方法,当应用出现内存警告时,就会崩溃。

崩溃信息

这个问题的崩溃日志:


crash log

问题关键信息:

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];
}
  1. 运行工程,在申请相册访问权限时点 Don't Allow
  2. 模拟内存警告,工具栏点 Debug -> Simulate Memory Warning,就会崩溃。
    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];

你可能感兴趣的:(PhotoKit崩溃问题,This application is not allowed to access Photo data.)