故事發(fā)生
- 因為用戶想使用頭像上傳功能拒絕授予app相機權限武翎,導致每次進入相機功能時候就黑屏花椭,需要修改此bug
那就開始先說說app如何加入了權限設置
前言
iOS 10發(fā)布以來禁漓,蘋果公司為了用戶的信息安全逼侦,在訪問內(nèi)部應用都加入了隱私權限設置择示,讓用戶來選擇是否使用令境。如果在開發(fā)中不對這些權限進行設置的話造成crash播揪。
1.在程序的Info.plist中添加如以下設置:
2.可以從下表中選擇相應權限進行配置
權限 | info.plist中key | info.plist中Value |
---|---|---|
相冊 | NSPhotoLibraryUsageDescription | 是否允許此app使用相冊? |
相機 | NSCameraUsageDescription | 是否允許此app使用相機? |
麥克風 | NSMicrophoneUsageDescription | 是否允許此app使用麥克風? |
位置 | NSLocationUsageDescription | 是否允許此app使用位置? |
在使用期間訪問位置 | NSLocationWhenInUseUsageDescription | 是否允許此app在使用期間訪問位置? |
始終訪問位置 | NSLocationAlwaysUsageDescription | 是否允許此app始終訪問位置贮喧? |
日歷 | NSCalendarsUsageDescription | 是否允許此app使用日歷? |
提醒事項 | NSRemindersUsageDescription | 是否允許此app使用提醒事項? |
運動與健身 | NSMotionUsageDescription | 是否允許此app使用運動與健身猪狈? |
健康更新 | NSHealthUpdateUsageDescription | 是否允許此app使用健康更新箱沦? |
健康分享 | NSHealthShareUsageDescription | 是否允許此app使用健康分享? |
藍牙 | NSBluetoothPeripheralUsageDescription | 是否允許此app使用藍牙雇庙? |
媒體資料庫 | NSAppleMusicUsageDescription | 是否允許此app使用媒體資料庫谓形? |
語音識別 | NSSpeechRecognitionUsageDescription | 是否允許此app使用語音識別? |
3.以運動與健身為例疆前,將上面表格中的key添加然后回車寒跳,在string中添加提示語言就完成了
故事繼續(xù)發(fā)生 -------------------------無奈的分割線-------
有些用戶就在系統(tǒng)彈出窗口不授予權限,那么我們在app上就要做權限判斷以及跳轉(zhuǎn)到系統(tǒng)設定界面
相冊權限--iOS 8.0之前
- 導入頭文件#import <AssetsLibrary/AssetsLibrary.h>;
- 檢查是否有相冊權限
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
switch (status) {
case ALAuthorizationStatusAuthorized:
NSLog(@"Authorized");
break;
case ALAuthorizationStatusDenied:
NSLog(@"Denied");
break;
case ALAuthorizationStatusNotDetermined:
NSLog(@"not Determined");
break;
case ALAuthorizationStatusRestricted:
NSLog(@"Restricted");
break;
default:
break;
}
其中竹椒,各個status代表的含義是
typedef NS_ENUM(NSInteger, AVAuthorizationStatus) {
AVAuthorizationStatusNotDetermined = 0, // 用戶尚未做出選擇這個應用程序的問候
AVAuthorizationStatusRestricted, // 此應用程序沒有被授權訪問的照片數(shù)據(jù)童太。可能是家長控制權限
AVAuthorizationStatusDenied, // 用戶已經(jīng)明確否認了這一照片數(shù)據(jù)的應用程序訪問
AVAuthorizationStatusAuthorized // 用戶已經(jīng)授權應用訪問照片數(shù)據(jù)
} NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
相冊權限--iOS 8.0之后
- 導入頭文件#import <Photos/Photos.h>;
- 檢查是否有相冊權限
PHAuthorizationStatus photoAuthorStatus = [PHPhotoLibrary authorizationStatus];
switch (photoAuthorStatus) {
case PHAuthorizationStatusAuthorized:
NSLog(@"Authorized");
break;
case PHAuthorizationStatusDenied:
NSLog(@"Denied");
break;
case PHAuthorizationStatusNotDetermined:
NSLog(@"not Determined");
break;
case PHAuthorizationStatusRestricted:
NSLog(@"Restricted");
break;
default:
break;
}
檢查是否有權限之后,如果沒有權限康愤,那么就要跳轉(zhuǎn)到系統(tǒng)的權限設置儡循,而
- (void)showAlert
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"相機權限未開啟"
message:@"相機權限未開啟,請進入系統(tǒng)【設置】>【隱私】>【相機】中打開開關,開啟相機功能"
delegate:nil
cancelButtonTitle:@"取消"
otherButtonTitles:@"立即開啟", nil];
@weakify(self);
[[alertView rac_buttonClickedSignal] subscribeNext:^(NSNumber *buttonIndex) {
@strongify(self);
if ([buttonIndex isEqualToNumber:@1]) {
#ifdef __IPHONE_8_0
//跳入當前App設置界面,通常使用此方法
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
#else
//適配iOS7 ,跳入系統(tǒng)設置界面
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"prefs:root=General&path=About"]];
#endif
}
}];
[alertView show];
}
在 YourAppTarget->Info->URL Types 這個地方征冷,如上圖择膝,寫上 prefs 字段;這樣在 iOS 8 及 iOS 9 中都親測有效检激。但是在iOS 10上無效
下面給出一個較為完整的列表肴捉,可以讓你隨意跳轉(zhuǎn)到 設置App 里的任意一個地方 :
info中,添加 URL Schemes為 prefs的url
【List of currently known URLs in the Settings app】
About — prefs:root=General&path=About
Accessibility — prefs:root=General&path=ACCESSIBILITY
AirplaneModeOn— prefs:root=AIRPLANE_MODE
Auto-Lock — prefs:root=General&path=AUTOLOCK
Brightness — prefs:root=Brightness
Bluetooth — prefs:root=General&path=Bluetooth
Date& Time — prefs:root=General&path=DATE_AND_TIME
FaceTime — prefs:root=FACETIME
General— prefs:root=General
Keyboard — prefs:root=General&path=Keyboard
iCloud — prefs:root=CASTLE iCloud
Storage & Backup — prefs:root=CASTLE&path=STORAGE_AND_BACKUP
International — prefs:root=General&path=INTERNATIONAL
Location Services — prefs:root=LOCATION_SERVICES
Music — prefs:root=MUSIC
Music Equalizer — prefs:root=MUSIC&path=EQ
Music VolumeLimit— prefs:root=MUSIC&path=VolumeLimit
Network — prefs:root=General&path=Network
Nike + iPod — prefs:root=NIKE_PLUS_IPOD
Notes — prefs:root=NOTES
Notification — prefs:root=NOTIFICATIONS_ID
Phone — prefs:root=Phone
Photos — prefs:root=Photos
Profile — prefs:root=General&path=ManagedConfigurationList
Reset — prefs:root=General&path=Reset
Safari — prefs:root=Safari Siri — prefs:root=General&path=Assistant
Sounds — prefs:root=Sounds
SoftwareUpdate— prefs:root=General&path=SOFTWARE_UPDATE_LINK
Store — prefs:root=STORE
Twitter — prefs:root=TWITTER
Usage — prefs:root=General&path=USAGE
VPN — prefs:root=General&path=Network/VPN
Wallpaper — prefs:root=Wallpaper
Wi-Fi — prefs:root=WIFI
Setting—prefs:root=INTERNET_TETHERING