Realización de vibraciones en la aplicación de grabación

Estoy tratando de realizar una vibración en una aplicación similar a Snapchat, que utiliza tanto la salida de audio como la input, así como la mezcla de audio de otras aplicaciones, pero esta parece ser una tarea más difícil que inicialmente pensé que sería. Importante saber es que no estoy tratando de vibrar durante la reproducción o la grabación. De leer toda la documentation que pude encontrar sobre el tema, esto es lo que he llegado a comprender:

  • Para admitir tanto la reproducción como la grabación (salida e ingreso), necesito usar AVAudioSessionCategoryPlayAndRecord
  • Hacer que el teléfono vibre a través de AudioServicesPlaySystemSound (kSystemSoundID_Vibrate) no es compatible con ninguna de las categorías de grabación, incluida AVAudioSessionCategoryPlayAndRecord .
  • La habilitación de otras aplicaciones para reproducir audio se puede hacer agregando la opción AVAudioSessionCategoryOptionMixWithOthers .

Por lo tanto, hago esto en mi delegado de la aplicación:

 NSError *error = nil; [[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers error:&error]; 

Las posibles soluciones para hacer la vibración que he intentado pero fallé son:

  • Desactivar el AVAudioSession compartido antes de vibrar, y luego activarlo inmediatamente después.

     [[AVAudioSession shanetworkingInstance] setActive:NO error:nil]; AudioServicesPlaySystemSound (kSystemSoundID_Vibrate); [[AVAudioSession shanetworkingInstance] setActive:YES error:nil]; 

    Esto realiza con éxito la vibración, pero después, cuando bash grabar una película, el audio se agita (o algo más está haciendo que sea muy silencioso). También me produce un error al decir que no tengo permiso para desactivar una session sin eliminar primero sus dispositivos de E / S.

  • Cambiar la categoría antes de vibrar y luego volver a cambiarla.

     [[AVAudioSession shanetworkingInstance] setActive:NO error:nil]; [[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]; [[AVAudioSession shanetworkingInstance] setActive:YES error:nil]; AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); [[AVAudioSession shanetworkingInstance] setActive:NO error:nil]; [[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers error:nil]; [[AVAudioSession shanetworkingInstance] setActive:YES error:nil]; 

    Esta solución aparece de vez en cuando, pero no parece funcionar para mí. No se produce vibración, aunque las categorías parecen estar configuradas. Esto podría ser una solución válida si configuro usesApplicationAudioSession = YES en mi AVCaptureSession, pero aún no lo he hecho.

Fuentes:

  • https://developer.apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/ConfiguringanAudioSession/ConfiguringanAudioSession.html

  • https://developer.apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionBasics/AudioSessionBasics.html

  • https://developer.apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioGuidelinesByAppType/AudioGuidelinesByAppType.html#//apple_ref/doc/uid/TP40007875-CH11-SW1

No especificó cuáles son los requisitos de su dispositivo compatible, pero para los dispositivos más nuevos, puede usar las nuevas API de motor taptic, como por ejemplo:

UIImpactFeedbackGenerator

UISelectionFeedbackGenerator

UINotificationFeedbackGenerator

https://developer.apple.com/reference/uikit/uifeedbackgenerator#2555399

Por lo tanto, recientemente he intentado reproducir un pitido simple en mi aplicación y uno de los methods para hacerlo me tropezó es:

 AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID); 

Es una function que reproduce un sonido del sistema desde /System/Library/Audio/UISounds/ es compatible con todas las versiones de iOS.

El sonido 1350 es igual a RingerVibeChanged (vibración). Asi que..

 AudioServicesPlaySystemSound(1350); 

… vibra durante unos 0.5 segundos.

En caso de que esté interesado en más sonidos, aquí hay un enlace a todos los sonidos reproducibles y en qué versiones de iOS se han agregado: http://iphonedevwiki.net/index.php/AudioServices