PhotoKit崩潰問題,This application is not allowed to access Photo data.

問題描述

系統(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];
}
  1. 運(yùn)行工程,在申請(qǐng)相冊(cè)訪問權(quán)限時(shí)點(diǎn) Don't Allow。
  2. 模擬內(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];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容