J'utilise le nouveau SDK développeur iOS7 et maintenant la demande d'application de l'utilisateur sa permission d'enregistrer à partir du micro lorsque l'application essaie d'enregistrer pour la première fois.
Mon application enregistrera après un compte à rebours, afin que l'utilisateur ne puisse pas voir cette demande. J'utilise ce code pour vérifier le requestRecordPermission
:
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
if (granted) {
// Microphone enabled code
}
else {
// Microphone disabled code
}
}];
Mais comment puis-je déclencher la demande moi-même avant de commencer à enregistrer?
Dans le nouvel iOS7, c'est très simple, essayez ceci:
if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)])
{
[[AVAudioSession sharedInstance] requestRecordPermission];
}
Voici l'extrait de code final qui fonctionne pour moi. Il prend en charge Xcode 4 et 5 et fonctionne pour 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];
}
Comme l'a affirmé "One Man Crew", vous pouvez utiliser requestRecordPermission.
Une chose importante à savoir est que vous devez vérifier que requestRecordPermission est implémenté. La raison en est que si votre application s'exécutait sur une ancienne version iOS (iOS 6.x par exemple), elle se bloquerait après cet appel. Pour éviter cela, vous devez vérifier que ce sélecteur est implémenté (c'est une bonne pratique de toute façon).
Le code devrait ressembler à ceci:
if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)]){
[[AVAudioSession sharedInstance] requestRecordPermission];
}
En utilisant cette méthode, votre application prend en charge le nouveau système d'exploitation ainsi que les versions précédentes du système d'exploitation.
J'utilise cette méthode à chaque fois Apple ajoute plus de fonctionnalités au nouveau système d'exploitation (de cette façon, je peux prendre en charge les anciennes versions assez facilement).
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)
});
Basé sur la réponse de 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;
}