故事发生
- 因为用户想使用头像上传功能拒绝授予app相机权限,导致每次进入相机功能时候就黑屏,需要修改此bug
那就开始先说说app如何加入了权限设置
前言
iOS 10发布以来,苹果公司为了用户的信息安全,在访问内部应用都加入了隐私权限设置,让用户来选择是否使用。如果在开发中不对这些权限进行设置的话造成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中添加提示语言就完成了
故事继续发生 -------------------------无奈的分割线-------
有些用户就在系统弹出窗口不授予权限,那么我们在app上就要做权限判断以及跳转到系统设定界面
相册权限--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, // 此应用程序没有被授权访问的照片数据。可能是家长控制权限
AVAuthorizationStatusDenied, // 用户已经明确否认了这一照片数据的应用程序访问
AVAuthorizationStatusAuthorized // 用户已经授权应用访问照片数据
} 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;
}
检查是否有权限之后,如果没有权限,那么就要跳转到系统的权限设置,而
- (void)showAlert
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"相机权限未开启"
message:@"相机权限未开启,请进入系统【设置】>【隐私】>【相机】中打开开关,开启相机功能"
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 ,跳入系统设置界面
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"prefs:root=General&path=About"]];
#endif
}
}];
[alertView show];
}
在 YourAppTarget->Info->URL Types 这个地方,如上图,写上 prefs 字段;这样在 iOS 8 及 iOS 9 中都亲测有效。但是在iOS 10上无效
下面给出一个较为完整的列表,可以让你随意跳转到 设置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