2013-06-13 5 views
18

Sto utilizzando il nuovo SDK per sviluppatori iOS7 e ora l'app richiede all'utente di registrare dal microfono quando l'app tenta di registrare la prima volta. enter image description hereCome richiedere l'autorizzazione di registrazione mic da parte dell'utente

La mia app registrerà dopo un conto alla rovescia, quindi l'utente non può vedere questa richiesta. Io uso questo codice per controllare il requestRecordPermission:

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

Ma come posso far scattare la richiesta da me prima di iniziare a registrare?

+0

@OneManCrew La domanda non sembra mostrare alcuno sforzo per risolvere il problema da sé, e in fondo è chiedere un tutorial. (Quindi "eccessivamente ampio" nella ragione vicina) –

risposta

26

Nel nuovo iOS7 è molto semplice provare questo:

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

Grazie !!! è lavoro! – user2068793

+6

In realtà in iOS7 questa funzione richiede l'utilizzo di blocchi che possono essere chiamati in questo modo: [[AVAudioSession sharedInstance] requestRecordPermission:^(risposta BOOL) { NSLog (@ "Consenti risposta utilizzo microfono:% d", risposta); }]; – c0d3Junk13

+0

Potrebbe anche essere necessario un #ifdef __IPHONE_7_0 intorno al codice sopra #endif per compilarlo nelle versioni precedenti di xcode. – c0d3Junk13

6

come "un uomo Crew" è stato superiore è possibile utilizzare requestRecordPermission.

È importante notare che è necessario che sia controllare che requestRecordPermission sia implementato. Il motivo è che se la tua app funzionasse su una versione iOS più vecchia (ad esempio iOS 6.x) si sarebbe bloccata dopo questa chiamata. Per evitare che sia necessario verificare che questo selettore sia implementato (questa è comunque una buona pratica).

codice dovrebbe essere qualcosa di simile:

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

Usando questo metodo la vostra applicazione potrebbe supportare il nuovo sistema operativo e anche le versioni precedenti del sistema operativo.

Sto usando questo metodo ogni volta che Apple aggiunge più funzionalità al nuovo sistema operativo (in questo modo posso supportare le versioni precedenti piuttosto facile).

+0

È banale! A proposito, se si utilizza questo metodo su versioni precedenti di iOS il metodo non farà nulla, perché il metodo fa parte del sdk ios7. –

+1

Non è ragionevole usare questo metodo con gli SDK precedenti perché non si compila su iOS 7 e non si ha nulla a che fare con esso. Ma se stai usando il nuovo SDK e scegli i dispositivi più vecchi (iOS 6.x per esempio), se non lo usi, verifica che la tua app si arresti definitivamente!Quindi, si prega di prestare attenzione a utilizzare questo controllo super importante. Succede ogni volta che Apple aggiunge una nuova funzionalità. Se era l'altro modo (funzione di rimozione Apple) la tua app non si arresterà in modo anomalo e ti verrà solo visualizzato un avviso che la funzione è deprecata (nessun arresto anomalo). – Idan

+0

Sei molto sbagliato! Non esiste alcuna connessione diretta tra il pacchetto SDK con il quale è stata creata l'applicazione e il sistema operativo installato sul dispositivo. È possibile creare app complete con l'SDK di IOS7 e funzionerà su SO più vecchio. !! – user2068793

10

Ecco lo snippet di codice finale che funziona per me. Supporta sia Xcode 4 e 5, e funziona per 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]; 
    } 
2
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) 
    }); 
1

In base alla risposta https://stackoverflow.com/users/1071887/idan s'.

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; 
}