iOS10出來之后盔粹,有一些童鞋提審應(yīng)用時會出現(xiàn)因為沒有對相機相冊等權(quán)限的設(shè)置提醒而被拒絕,以及出現(xiàn)調(diào)取本地相冊相機等出現(xiàn)崩潰魂毁,這是蘋果為了安全而設(shè)置的權(quán)限所導致的玻佩,解決的辦法就是在 plist 文件里添加相應(yīng)的獲取權(quán)限出嘹。
配置權(quán)限:
相機權(quán)限:Privacy - Camera Usage Description 允許此權(quán)限才能使用相機功席楚,這樣才能錄制視頻,并且想要保存圖片税稼。
相冊權(quán)限:Privacy - Photo Library Usage Description 允許此權(quán)限才能使用系統(tǒng)相冊烦秩。
麥克風權(quán)限:Privacy - Microphone Usage Description 獲取麥克風權(quán)限不然會崩垮斯,只有允許此權(quán)限才能錄音。
在info.plist里增加一項只祠,key從上面的三項任一項拷貝兜蠕,然后運行后會出現(xiàn)授權(quán)的警示框,同意后就沒有問題了抛寝。
<!-- 相冊 -->
<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直接復(fù)制 value的string字符串就是提示的文字 可以根據(jù)自己需要填寫
判斷相機權(quán)限是否被限制熊杨,判斷相機是否可以使用
判斷相機權(quán)限是否被限制
需要導入 AVFoundation 類
import <AVFoundation/AVFoundation.h>
// iOS 判斷應(yīng)用是否有使用相機的權(quán)限
NSString *mediaType = AVMediaTypeVideo;//讀取媒體類型
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];//讀取設(shè)備授權(quán)狀態(tài)
if(authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied){
NSString *errorStr = @"應(yīng)用相機權(quán)限受限,請在設(shè)置中啟用";
[[HUDHelper getInstance] showErrorTipWithLabel:errorStr view:self.navigationController.view];
return;
}
如圖狀態(tài)是一個枚舉
typedef NS_ENUM(NSInteger, AVAuthorizationStatus) {
AVAuthorizationStatusNotDetermined = 0,
AVAuthorizationStatusRestricted,
AVAuthorizationStatusDenied,
AVAuthorizationStatusAuthorized
} NS_AVAILABLE_IOS(7_0);
AVAuthorizationStatusNotDetermined
用戶還沒有對應(yīng)用程序授權(quán)進行操作
AVAuthorizationStatusRestricted
還沒有授權(quán)訪問的照片數(shù)據(jù)。
AVAuthorizationStatusDenied
用戶拒絕對應(yīng)用程序授權(quán)
AVAuthorizationStatusAuthorized
用戶對應(yīng)用程序授權(quán)
另外盗舰,需要對相機進行判斷是否被授權(quán)晶府,而相冊不需要判斷是否授權(quán)。
因為相機沒有授權(quán)的話不能被使用卻沒有任何有用的提示钻趋。
可以自行根據(jù)判斷設(shè)置成這樣的提示
而相冊的話川陆,系統(tǒng)默認modol出界面提示
就不需要我們進行判斷,提示用戶了蛮位。
上述視圖判斷邏輯代碼如下
- (void)PhotoClick:(UIButton *)button{
switch (button.tag) {
case 1:{
DLog(@"拍照");
[self.darkView removeFromSuperview];
UIImagePickerController *pick = [[UIImagePickerController alloc]init];
pick.sourceType = UIImagePickerControllerSourceTypeCamera;
pick.delegate = self;
//判斷是否有相機權(quán)限
NSString *mediaType = AVMediaTypeVideo;//讀取媒體類型
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];//讀取設(shè)備授權(quán)狀態(tài)
if(authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied){
NSString *errorStr = @"應(yīng)用相機權(quán)限受限,請在iPhone的“設(shè)置-隱私-相機”選項中较沪,允許好享玩訪問你的相機。";
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 方法調(diào)用相冊 相機也一樣
[self presentViewController:pick animated:YES completion:nil];
}
break;
default:
break;
}
}
判斷相機是否可以使用
以下是參考方法:
pragma mark - 攝像頭和相冊相關(guān)的公共類
// 判斷設(shè)備是否有攝像頭
- (BOOL) isCameraAvailable{
return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
}
// 前面的攝像頭是否可用
- (BOOL) isFrontCameraAvailable{
return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];
}
// 后面的攝像頭是否可用
- (BOOL) isRearCameraAvailable{
return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];
}
相應(yīng)的我們需要判斷用戶的攝像頭是否是壞的失仁,以防程序crash
if (![self isFrontCameraAvailable]) {
//判斷相機是否可用
NSString *errorStr = @"相機出現(xiàn)問題尸曼,將跳轉(zhuǎn)到相冊選擇照片";
[[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;
}
如果攝像頭壞了的話,我們可以直接跳到從相冊中選擇照片萄焦。
判斷用戶訪問相冊權(quán)限
iOS10以上系統(tǒng)
首先骡苞,需在工程對應(yīng)的plist文件內(nèi)添加“Privacy - Photo Library Usage Description”這個key,同時設(shè)置其值為“App needs your permission to access the Photo”類似這樣的說明楷扬。
//獲取相冊訪問權(quán)限
PHAuthorizationStatus photoStatus = [PHPhotoLibrary authorizationStatus];
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{
switch (status) {
case PHAuthorizationStatusAuthorized: //已獲取權(quán)限
break;
case PHAuthorizationStatusDenied: //用戶已經(jīng)明確否認了這一照片數(shù)據(jù)的應(yīng)用程序訪問
break;
case PHAuthorizationStatusRestricted://此應(yīng)用程序沒有被授權(quán)訪問的照片數(shù)據(jù)解幽。可能是家長控制權(quán)限
break;
default://其他烘苹。躲株。。
break;
}
});
}];