Ответ 1
В новом iOS7 очень просто попробовать следующее:
if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)])
{
[[AVAudioSession sharedInstance] requestRecordPermission];
}
Я использую новый SDK разработчика iOS7 и теперь приложение запрашивает у пользователя его разрешение на запись с микрофона, когда приложение пытается записать в первый раз.
Мое приложение будет записываться после обратного отсчета, поэтому пользователь не сможет увидеть этот запрос.
Я использую этот код для проверки requestRecordPermission
:
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
if (granted) {
// Microphone enabled code
}
else {
// Microphone disabled code
}
}];
Но как я могу запустить запрос самостоятельно, прежде чем начать запись?
В новом iOS7 очень просто попробовать следующее:
if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)])
{
[[AVAudioSession sharedInstance] requestRecordPermission];
}
Вот окончательный фрагмент кода, который работает для меня. Он поддерживает как 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];
}
Как "One Man Crew" заявили, что вы можете использовать requestRecordPermission.
Важно знать, что вы должны проверить, что requestRecordPermission реализован. Причина в том, что если ваше приложение будет работать на более ранней версии iOS (например, iOS 6.x), он будет аварийно завершен после этого вызова. Чтобы предотвратить это, вы должны проверить, что этот селектор реализован (в любом случае это хорошая практика).
Код должен быть примерно таким:
if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)]){
[[AVAudioSession sharedInstance] requestRecordPermission];
}
Используя этот метод, ваше приложение будет поддерживать новую ОС, а также предыдущие версии ОС.
Я использую этот метод каждый раз, когда Apple добавляет больше функциональности в новую ОС (таким образом, я могу поддерживать более старые версии довольно легко).
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)
});
На основе 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;
}