Как я могу запросить разрешение микрофонной записи у пользователя

Я использую новый SDK разработчика iOS7 и теперь приложение запрашивает у пользователя его разрешение на запись с микрофона, когда приложение пытается записать в первый раз. enter image description here

Мое приложение будет записываться после обратного отсчета, поэтому пользователь не сможет увидеть этот запрос. Я использую этот код для проверки requestRecordPermission:

[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
            if (granted) {
                // Microphone enabled code
            }
            else {
                // Microphone disabled code
            }
        }];

Но как я могу запустить запрос самостоятельно, прежде чем начать запись?

Ответ 1

В новом iOS7 очень просто попробовать следующее:

if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)])
{
    [[AVAudioSession sharedInstance] requestRecordPermission];
}

Ответ 2

Вот окончательный фрагмент кода, который работает для меня. Он поддерживает как Xcode 4, так и 5, и работает для iOS5 +.

#ifndef __IPHONE_7_0
    typedef void (^PermissionBlock)(BOOL granted);
#endif

    PermissionBlock permissionBlock = ^(BOOL granted) {
        if (granted)
        {
            [self doActualRecording];
        }
        else
        {
            // Warn no access to microphone
        }
    };

    // iOS7+
    if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)])
    {
        [[AVAudioSession sharedInstance] performSelector:@selector(requestRecordPermission:)
                                              withObject:permissionBlock];
    }
    else
    {
        [self doActualRecording];
    }

Ответ 3

Как "One Man Crew" заявили, что вы можете использовать requestRecordPermission.

Важно знать, что вы должны проверить, что requestRecordPermission реализован. Причина в том, что если ваше приложение будет работать на более ранней версии iOS (например, iOS 6.x), он будет аварийно завершен после этого вызова. Чтобы предотвратить это, вы должны проверить, что этот селектор реализован (в любом случае это хорошая практика).

Код должен быть примерно таким:

if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)]){
    [[AVAudioSession sharedInstance] requestRecordPermission];
}

Используя этот метод, ваше приложение будет поддерживать новую ОС, а также предыдущие версии ОС.

Я использую этот метод каждый раз, когда Apple добавляет больше функциональности в новую ОС (таким образом, я могу поддерживать более старые версии довольно легко).

Ответ 4

    AVAudioSession.sharedInstance().requestRecordPermission({ (granted) -> Void in
        if !granted
        {
            let microphoneAccessAlert = UIAlertController(title: NSLocalizedString("recording_mic_access",comment:""), message: NSLocalizedString("recording_mic_access_message",comment:""), preferredStyle: UIAlertControllerStyle.Alert)

            var okAction = UIAlertAction(title: NSLocalizedString("OK",comment:""), style: UIAlertActionStyle.Default, handler: { (alert: UIAlertAction!) -> Void in
                UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!)
            })


            var cancelAction = UIAlertAction(title: NSLocalizedString("Cancel",comment:""), style: UIAlertActionStyle.Cancel, handler: { (alert: UIAlertAction!) -> Void in

            })
            microphoneAccessAlert.addAction(okAction)
            microphoneAccessAlert.addAction(cancelAction)
            self.presentViewController(microphoneAccessAlert, animated: true, completion: nil)
            return
        }
        self.performSegueWithIdentifier("segueNewRecording", sender: nil)
    });

Ответ 5

На основе https://stackoverflow.com/users/1071887/idan ответа.

AVAudioSession *session = [AVAudioSession sharedInstance];

// AZ DEBUG @@ iOS 7+
AVAudioSessionRecordPermission sessionRecordPermission = [session recordPermission];
switch (sessionRecordPermission) {
    case AVAudioSessionRecordPermissionUndetermined:
        NSLog(@"Mic permission indeterminate. Call method for indeterminate stuff.");
        break;
    case AVAudioSessionRecordPermissionDenied:
        NSLog(@"Mic permission denied. Call method for denied stuff.");
        break;
    case AVAudioSessionRecordPermissionGranted:
        NSLog(@"Mic permission granted.  Call method for granted stuff.");
        break;
    default:
        break;
}