私たちは皆そこにいました。アプリ内で写真を撮りたい、または写真、マイク、連絡先などにアクセスしたい...しかし、最初に iOS はユーザーに許可を求めるプロンプトを表示する必要があります。多くの場合、ユーザーはアクセスを拒否します。
ユーザーがアクセスを拒否したことをアプリが検出した場合は、次のようにしてユーザーをアプリのプライバシー設定に移動できます。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
ハンディ。でも....
ユーザーにスイッチをオンに切り替えるよう説得しても、アプリは変更を検出しないことに気付きました。
このコードを検討してください。ユーザーは、カメラへのアクセス許可をすぐに求められます (これは、アプリが初めて実行されたときにのみ表示されます)。ユーザーが許可を拒否したとします。次に、最終的にカメラへのアクセスを有効にしたいと判断しました。問題ない。ユーザーがボタンをタップすると、プライバシー パネルが表示されます。ユーザーがスイッチを変更してアクセスを許可します。その後、ユーザーはアプリに戻ります。パーミッションを再度読み取る UIApplicationDidBecomeActiveNotification に対してブロックが起動します。ただし、ユーザーの変更は反映されません (依然として Denied として読み取られます)。
アプリがメモリから消去されて再度実行されると、状態が適切に読み取られます。
すべての権限がこのように動作するわけではありません。たとえば、CoreLocation はユーザーの変更を検出しているようです。通知の変更を検出する方法も見つけました。ただし、連絡先、カレンダー、カメラ、マイク、Core Motion (その他) については、アプリを終了して再度実行するまで、変更は検出されません。
何か案は?
#import "ViewController.h"
@import AVFoundation;
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
[self printPermission];
}];
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
[self printPermission];
}];
}
-(void)printPermission{
dispatch_async(dispatch_get_main_queue(), ^{
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if(status == AVAuthorizationStatusNotDetermined){
NSLog(@"VWWPermissionStatusNotDetermined");
self.view.backgroundColor = [UIColor whiteColor];
} else if(status == AVAuthorizationStatusAuthorized){
NSLog(@"VWWPermissionStatusAuthorized");
self.view.backgroundColor = [UIColor greenColor];
} else if(status == AVAuthorizationStatusDenied) {
NSLog(@"VWWPermissionStatusDenied");
self.view.backgroundColor = [UIColor redColor];
} else if(status == AVAuthorizationStatusRestricted) {
NSLog(@"VWWPermissionStatusRestricted");
self.view.backgroundColor = [UIColor redColor];
}
});
}
- (IBAction)buttonAction:(id)sender {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
@end