3

私たちは皆そこにいました。アプリ内で写真を撮りたい、または写真、マイク、連絡先などにアクセスしたい...しかし、最初に 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
4

1 に答える 1

2

つまり、これは iOS 9b1 に関連するバグであることが判明しました。

アクセス許可の検出は、iOS 8 で正常に動作します。

メイン キューのアクセス許可を確認する必要があることを知りました。これを行うと、更新が反映されます。

于 2015-06-16T17:36:02.133 に答える