即使获得许可,iOS麦克风选项也不在应用程序设置中

时间:2016-12-05 02:16:27

标签: ios objective-c

我在iOS 10上要求获得麦克风的许可时遇到了一个奇怪的问题。我把正确的plist属性(隐私 - 麦克风使用说明)和通过代码启用它。在我的手机上,麦克风工作/启用,我在手机的应用程序设置中看到它。但是,在朋友的手机上,麦克风会要求许可,但麦克风选项不会显示在应用程序的设置中。我在这里错过了什么,即使我正确设置权限?为什么我的手机会在设置中显示选项而不是我朋友的手机?我有iPhone SE,而我的朋友有iPhone 6s。

plist property:

<key>NSMicrophoneUsageDescription</key>
<string>Used to capture microphone input</string>

要求许可的代码:

if ([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio] == AVAuthorizationStatusAuthorized) {
    [self configureMicrophone];
}
else {
    UIAlertController *deniedAlert = [UIAlertController alertControllerWithTitle:@"Use your microphone?"
                                                                         message:@"The FOO APP requires access to your microphone to work!"
                                                                  preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *action = [UIAlertAction actionWithTitle:@"Go to Settings" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action){
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
    }];
    [deniedAlert addAction:action];
    [self presentViewController:deniedAlert animated:YES completion:nil];
}

谢谢!

1 个答案:

答案 0 :(得分:4)

您的代码不正确。您检查用户是否已获得权限。如果没有,则不要求许可。您只需显示一个警报,并选择转到设置页面。但如果您的应用从不请求使用麦克风的权限,则“设置”页面上不会设置麦克风。

您需要实际请求权限的代码。我有以下用于处理麦克风权限的代码:

+ (void)checkMicrophonePermissions:(void (^)(BOOL allowed))completion {
    AVAudioSessionRecordPermission status = [[AVAudioSession sharedInstance] recordPermission];
    switch (status) {
        case AVAudioSessionRecordPermissionGranted:
            if (completion) {
                completion(YES);
            }
            break;
        case AVAudioSessionRecordPermissionDenied:
        {
            // Optionally show alert with option to go to Settings

            if (completion) {
                completion(NO);
            }
        }
            break;
        case AVAudioSessionRecordPermissionUndetermined:
            [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
                if (granted && completion) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        completion(granted);
                    });
                }
            }];
            break;
    }

}

您可以按如下方式调用:

[whateverUtilClass checkMicrophonePermissions:^(BOOL allowed) {
    if (allowed) {
        [self configureMicrophone];
    }
}];