iOS關于相機相冊權限設置

iOS10出來之后,有一些童鞋提審應用時會出現因為沒有對相機相冊等權限的設置提醒而被拒絕,以及出現調取本地相冊相機等出現崩潰,這是蘋果為了安全而設置的權限所導致的,解決的辦法就是在 plist 文件里添加相應的獲取權限。

配置權限:
相機權限:Privacy - Camera Usage Description 允許此權限才能使用相機功,這樣才能錄制視頻,并且想要保存圖片。
相冊權限:Privacy - Photo Library Usage Description 允許此權限才能使用系統相冊。
麥克風權限:Privacy - Microphone Usage Description 獲取麥克風權限不然會崩,只有允許此權限才能錄音。
在info.plist里增加一項,key從上面的三項任一項拷貝,然后運行后會出現授權的警示框,同意后就沒有問題了。

<!-- 相冊 -->   
<key>NSPhotoLibraryUsageDescription</key>   
<string>App需要您的同意,才能訪問相冊</string>   
<!-- 相機 -->   
<key>NSCameraUsageDescription</key>   
<string>App需要您的同意,才能訪問相機</string>   
<!-- 麥克風 -->   
<key>NSMicrophoneUsageDescription</key>   
<string>App需要您的同意,才能訪問麥克風</string>   
<!-- 位置 -->   
<key>NSLocationUsageDescription</key>   
<string>App需要您的同意,才能訪問位置</string>   
<!-- 在使用期間訪問位置 -->   
<key>NSLocationWhenInUseUsageDescription</key>   
<string>App需要您的同意,才能在使用期間訪問位置</string>   
<!-- 始終訪問位置 -->   
<key>NSLocationAlwaysUsageDescription</key>   
<string>App需要您的同意,才能始終訪問位置</string>   
<!-- 日歷 -->   
<key>NSCalendarsUsageDescription</key>   
<string>App需要您的同意,才能訪問日歷</string>   
<!-- 提醒事項 -->   
<key>NSRemindersUsageDescription</key>   
<string>App需要您的同意,才能訪問提醒事項</string>   
<!-- 運動與健身 -->   
<key>NSMotionUsageDescription</key> 
<string>App需要您的同意,才能訪問運動與健身</string>   
<!-- 健康更新 -->   
<key>NSHealthUpdateUsageDescription</key>   
<string>App需要您的同意,才能訪問健康更新 </string>   
<!-- 健康分享 -->   
<key>NSHealthShareUsageDescription</key>   
<string>App需要您的同意,才能訪問健康分享</string>   
<!-- 藍牙 -->   
<key>NSBluetoothPeripheralUsageDescription</key>   
<string>App需要您的同意,才能訪問藍牙</string>   
<!-- 媒體資料庫 -->   
<key>NSAppleMusicUsageDescription</key>  
<string>App需要您的同意,才能訪問媒體資料庫</string>  

info.plist中逐個添加 KEY直接復制 value的string字符串就是提示的文字 可以根據自己需要填寫

one.png

判斷相機權限是否被限制,判斷相機是否可以使用

判斷相機權限是否被限制

需要導入 AVFoundation 類

import <AVFoundation/AVFoundation.h>

// iOS 判斷應用是否有使用相機的權限

NSString *mediaType = AVMediaTypeVideo;//讀取媒體類型  
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];//讀取設備授權狀態  
if(authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied){  
    NSString *errorStr = @"應用相機權限受限,請在設置中啟用";  
    [[HUDHelper getInstance] showErrorTipWithLabel:errorStr view:self.navigationController.view];  
    return;  
}  

如圖狀態是一個枚舉

typedef NS_ENUM(NSInteger, AVAuthorizationStatus) {  
    AVAuthorizationStatusNotDetermined = 0,  
    AVAuthorizationStatusRestricted,  
    AVAuthorizationStatusDenied,  
    AVAuthorizationStatusAuthorized  
} NS_AVAILABLE_IOS(7_0);  

AVAuthorizationStatusNotDetermined  

用戶還沒有對應用程序授權進行操作

AVAuthorizationStatusRestricted  

還沒有授權訪問的照片數據。

AVAuthorizationStatusDenied  

用戶拒絕對應用程序授權

AVAuthorizationStatusAuthorized  

用戶對應用程序授權

另外,需要對相機進行判斷是否被授權,而相冊不需要判斷是否授權。
因為相機沒有授權的話不能被使用卻沒有任何有用的提示。

01E8E.png

可以自行根據判斷設置成這樣的提示

C95CA.png

而相冊的話,系統默認modol出界面提示

7AD83.png

就不需要我們進行判斷,提示用戶了。

上述視圖判斷邏輯代碼如下



- (void)PhotoClick:(UIButton *)button{
    
    switch (button.tag) {
        case 1:{
            DLog(@"拍照");
            [self.darkView removeFromSuperview];
            UIImagePickerController *pick = [[UIImagePickerController alloc]init];
            pick.sourceType = UIImagePickerControllerSourceTypeCamera;
            pick.delegate = self;
            
            
            //判斷是否有相機權限
            NSString *mediaType = AVMediaTypeVideo;//讀取媒體類型
            AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];//讀取設備授權狀態
            if(authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied){
                NSString *errorStr = @"應用相機權限受限,請在iPhone的“設置-隱私-相機”選項中,允許好享玩訪問你的相機。";
                DLog(@"相機不可用");
                
                //必須使用present 方法
                //[self presentViewController:pick animated:YES completion:nil];
                
                [self showAlertControllerWithMessage:errorStr];
            
            
            } else {
            
                DLog(@"相機可用");
                
                //必須使用present 方法
                [self presentViewController:pick animated:YES completion:nil];
            
            }
            
            
            
        }
            
            break;
        case 2:{
            DLog(@"相冊");
            [self.darkView removeFromSuperview];
            UIImagePickerController *pick = [[UIImagePickerController alloc]init];
            pick.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            pick.delegate = self;
            //必須使用present 方法調用相冊  相機也一樣
            [self presentViewController:pick animated:YES completion:nil];
            
        }
            break;
        default:
            break;
    }
}



判斷相機是否可以使用

以下是參考方法:

pragma mark - 攝像頭和相冊相關的公共類

// 判斷設備是否有攝像頭  
- (BOOL) isCameraAvailable{  
    return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];  
}  
  
// 前面的攝像頭是否可用  
- (BOOL) isFrontCameraAvailable{  
    return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];  
}  
  
// 后面的攝像頭是否可用  
- (BOOL) isRearCameraAvailable{  
    return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];  
}  

相應的我們需要判斷用戶的攝像頭是否是壞的,以防程序crash

if (![self isFrontCameraAvailable]) {  
        //判斷相機是否可用  
        NSString *errorStr = @"相機出現問題,將跳轉到相冊選擇照片";  
        [[HUDHelper getInstance] showErrorTipWithLabel:errorStr view:self.navigationController.view];  
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{  
            [self openPhotoLibrary];  
        });  
        return;  
    }  

如果攝像頭壞了的話,我們可以直接跳到從相冊中選擇照片。

判斷用戶訪問相冊權限

iOS10以上系統
首先,需在工程對應的plist文件內添加“Privacy - Photo Library Usage Description”這個key,同時設置其值為“App needs your permission to access the Photo”類似這樣的說明。

//獲取相冊訪問權限
PHAuthorizationStatus photoStatus = [PHPhotoLibrary authorizationStatus];

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
    dispatch_async(dispatch_get_main_queue(), ^{
        switch (status) {
            case PHAuthorizationStatusAuthorized: //已獲取權限
                break;
            
            case PHAuthorizationStatusDenied: //用戶已經明確否認了這一照片數據的應用程序訪問
                break;
            
            case PHAuthorizationStatusRestricted://此應用程序沒有被授權訪問的照片數據。可能是家長控制權限
                break;
           
            default://其他。。。
                break;
        }
    });
}];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370