問題描述
系統(tǒng)要求:無
設(shè)備要求:無
問題詳情:用戶禁止應(yīng)用訪問相冊(cè),但應(yīng)用仍然調(diào)用了-[PHImageManager defaultManager]方法,當(dāng)應(yīng)用出現(xiàn)內(nèi)存警告時(shí),就會(huì)崩潰。
崩潰信息
這個(gè)問題的崩潰日志:

crash log
問題關(guān)鍵信息:
This application is not allowed to access Photo data.
復(fù)現(xiàn)方法
1.創(chuàng)建一個(gè)新工程,添加相冊(cè)讀取權(quán)限Privacy - Photo Library Usage Description。
2.在ViewDidLoad的時(shí)候調(diào)用 -[PHImageManager defaultManager]。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[PHImageManager defaultManager];
}
- 運(yùn)行工程,在申請(qǐng)相冊(cè)訪問權(quán)限時(shí)點(diǎn) Don't Allow。
- 模擬內(nèi)存警告,工具欄點(diǎn)
Debug->Simulate Memory Warning,就會(huì)崩潰。
Memory warning
原因分析
PHImageManager在初始化的時(shí)候添加DISPATCH_SOURCE_TYPE_MEMORYPRESSURE事件通知,當(dāng)內(nèi)存不夠的時(shí)候會(huì)嘗試移除緩存。PHImageManager 是一個(gè)懶加載的對(duì)象,你如果曾經(jīng)調(diào)用過 -[PHImageManager defaultManager] 隱式初始化,而且沒獲得相冊(cè)權(quán)限,就會(huì)導(dǎo)致 crash。
解決方案
讀取相冊(cè)前先判斷相冊(cè)權(quán)限:
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
switch (status) {
case PHAuthorizationStatusAuthorized:
// 可以讀取相冊(cè)
break;
case PHAuthorizationStatusNotDetermined:
// 執(zhí)行獲取權(quán)限操作
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized) {
// 可以讀取相冊(cè)
} else {
// 提示在設(shè)置中打開相冊(cè)訪問權(quán)限
}
}];
break;
case PHAuthorizationStatusDenied:
// 提示在設(shè)置中打開相冊(cè)訪問權(quán)限
break;
case PHAuthorizationStatusRestricted:
// 提示訪問相冊(cè)受到限制,比如家長(zhǎng)控制
break;
default:
break;
}
確保擁有相冊(cè)權(quán)限才讀取相冊(cè)圖片,尤其是調(diào)用-[PHImageManager defaultManager]。
另外打開設(shè)置中當(dāng)前應(yīng)用設(shè)置的方法如下:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
