
我最近通过xcode上传到AppStrore遇到了一次成功的上传,但是在iTunes的MyApps中找不到构建版本〜,稍后将通过查询信息来查找. 这是因为~~ markmarkmark是由于在申请相应许可时未在值中填写相应内容而引起的. 愚蠢的哭泣
由于Apple严格控制获取用户的隐私权,因此在获取用户的相机/相册/位置/通知权限时,必须先由用户手动授权,然后才能获取. 故事就是从这样的场景开始的.
问: 我需要做什么才能获得相应的权限?

A: 需要在info.plist中预先设置相应的许可密钥值ios 相机相册权限,如下所示
Privacy - Camera Usage Description -> 相机 Privacy - Microphone Usage Description -> 麦克风 Privacy - Photo Library Usage Description -> 读取相册 Privacy - Photo Library Additions Usage Description -> 保存图片至相册 Privacy - NSLocationAlwaysUsageDescription -> 始终获取地理位置 Privacy - NSLocationWhenInUseUsageDescription -> 使用时获取地理位置 PS:位置授权二选一即可
在使用相应功能(例如打开相册)时,系统会弹出一个框ios 相机相册权限,询问用户授权.

问: 如果用户不同意授权或拒绝授权,如何确保使用相关功能时提示用户打开权限?
A: 需要检测相应的权限状态,
如果未授权用户---->提示用户进行授权(系统行为)

如果用户之前拒绝授权->提示用户启用授权(应用实现)
下面
+(BOOL)detectionMediaState:(void(^)())authorizedBlock
{
BOOL isAvalible = NO;
NSString *mediaType = AVMediaTypeAudio;
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
//用户尚未授权->申请权限
if (authStatus == AVAuthorizationStatusNotDetermined)
{
[AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) {
if(granted)
{
if (authorizedBlock)
{
authorizedBlock();
}
}}];
}
//用户已经授权
else if (authStatus == AVAuthorizationStatusAuthorized)
{
isAvalible = YES;
if (authorizedBlock)
{
authorizedBlock();
}
}
//用户拒绝授权
else
{
//提示用户开启麦克风权限
[SystemManager openSettingPagewithMessage:@"麦克风"];
}
return isAvalible;
} +(BOOL)detectionPhotoState:(void(^)())authorizedBlock
{
BOOL isAvalible = NO;
if (iOS8OrLater)
{
PHAuthorizationStatus authStatus = [PHPhotoLibrary authorizationStatus];
//用户尚未授权
if (authStatus == PHAuthorizationStatusNotDetermined)
{
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized)
{
if (authorizedBlock)
{
authorizedBlock();
}
}}];
}
//用户已经授权
else if (authStatus == PHAuthorizationStatusAuthorized)
{
isAvalible = YES;
if (authorizedBlock)
{
authorizedBlock();
}
}
//用户拒绝授权
else
{
//提示用户开启相册权限
[SystemManager openSettingPagewithMessage:@"照片"];
}
}
else
{
ALAuthorizationStatus authStatus = [ALAssetsLibrary authorizationStatus];
//用户已经授权
if (authStatus == ALAuthorizationStatusAuthorized)
{
isAvalible = YES;
if (authorizedBlock)
{
authorizedBlock();
}
}
//用户拒绝授权
else
{
//提示用户开启相册权限
[SystemManager openSettingPagewithMessage:@"照片"];
}
}
return isAvalible;
} +(BOOL)detectionCameraState:(void(^)())authorizedBlock
{
BOOL isAvalible = NO;
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
//用户尚未授权
if (authStatus == AVAuthorizationStatusNotDetermined)
{
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if (granted)
{
if (authorizedBlock)
{
authorizedBlock();
}
}
}];
}
//用户已经授权
else if (authStatus == AVAuthorizationStatusAuthorized)
{
isAvalible = YES;
if (authorizedBlock)
{
authorizedBlock();
}
}
//用户拒绝授权
else
{
//提示用户开启相机权限
[SystemManager openSettingPagewithMessage:@"相机"];
}
return isAvalible;
} +(BOOL)detectionNotificationState:(void(^)())authorizedBlock
{
BOOL isAvalible = NO;
if (iOS8OrLater)
{
//用户拒绝授权
if ([UIApplication sharedApplication].currentUserNotificationSettings.types == UIUserNotificationTypeNone)
{
isAvalible = NO;
//提示用户开启通知权限
[SystemManager openSettingPagewithMessage:@"通知"];
}
else
{
isAvalible = YES;
}
}
return isAvalible;
} +(BOOL)detectionLocationState:(void(^)())authorizedBlock
{
BOOL isAvalible = NO;
CLAuthorizationStatus authStatus = [CLLocationManager authorizationStatus];
if (iOS8OrLater)
{
//用户尚未授权
if (authStatus == kCLAuthorizationStatusNotDetermined)
{
//检测位置服务是否可用
if([CLLocationManager locationServicesEnabled])
{
if(!_locationManager)
{
_locationManager = [[CLLocationManager alloc] init];
if([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
{
[_locationManager requestWhenInUseAuthorization];
}
//设置代理
[_locationManager setDelegate:self];
//设置定位精度
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
//设置距离筛选
[_locationManager setDistanceFilter:100];
[_locationManager startUpdatingHeading];
}
else
{
//开始定位
[_locationManager startUpdatingLocation];
}
}
else
{
//提示用户打开定位权限
[SystemManager openSettingPagewithMessage:@"定位"];
}
}
//用户已经授权
else if (authStatus == kCLAuthorizationStatusAuthorizedAlways||authStatus == kCLAuthorizationStatusAuthorizedWhenInUse)
{
isAvalible = YES;
if (authorizedBlock)
{
authorizedBlock();
}
}
//用户决绝授权
else
{
//提示用户打开定位权限
[SystemManager openSettingPagewithMessage:@"定位"];
}
}
return isAvalible;
}

Q: 提示用户打开相应的权限. 我可以直接跳到相应的切换页面吗?
A: 可能是iOS8之后的版本
+(void)openSettingPagewithMessage:(NSString *)message
{
if (iOS8OrLater)
{
[[SystemManager shareManager] showSystemAlertwithTitle:@"提示" message:[NSString stringWithFormat:@"为了更好的体验功能,请到设置页面->隐私->%@,将XX对应开关开启",message] cancelButtonTitle:@"下次提醒" otherButtonTitles:@"去设置" baseController:nil resultBlock:^(NSInteger index) {
if (index == 1)
{
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url])
{
[[UIApplication sharedApplication] openURL:url];
}
}
}];
}
//iOS8以下
else
{
[[SystemManager shareManager] showSystemAlertwithTitle:@"提示" message:[NSString stringWithFormat:@"为了更好的体验功能,请到设置页面->隐私->%@,将XX对应开关开启",message] cancelButtonTitle:@"我知道了" otherButtonTitles:nil baseController:nil resultBlock:nil];
}
}
XX为App的名字
谢谢大家.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-156657-1.html
然而今天人已经来犯我
我们的海军和空军以及二炮部队可以现在举办南海实弹军事联合演习
看来可以做的更好的
鼓励那些国家和中国对着干