iphone - esta aplicación fue desarrollada y funciona bien bajo iOS 5.0, pero se bloquea bajo ios 4.3
crash avaudiosession (3)
El método AVAudioSession
- (BOOL)setMode:(NSString *)theMode error:(NSError **)outError
Está marcado en la documentación como disponible solo para iOS 5 y posterior. De hecho, dada la reciente incorporación de modos a la documentación , parece que los modos de sesión de audio no están disponibles en absoluto antes de iOS 5.
Desarrollé una aplicación para iPhone con iOS 5.0 y funciona bien. Pero cuando se trata de iOS 4.3 (Base SDK = el último iOS 5.0, compilador = Apple LLVM 3.0, Deployment Target = iOS 4.3), se bloquea después del lanzamiento.
La salida alrededor del punto de choque se ve así:
2011-12-06 16:25:08.177 FMWei[466:c203] -[AVAudioSession setMode:error:]: unrecognized selector sent to instance 0x706a7f0
2011-12-06 16:25:08.181 FMWei[466:c203] *** Terminating app due to uncaught exception ''NSInvalidArgumentException'', reason: ''-[AVAudioSession setMode:error:]: unrecognized selector sent to instance 0x706a7f0''
Parece que AVAudioSession
no tiene una función miembro setMode:error:
mientras lo setMode:error:
. Pero lo extraño es que no setMode:error:
una función cuyo nombre es setMode:error:
El código sobre el procesamiento de audio es:
audio_session = [[AVAudioSession sharedInstance] retain];
audio_session_err = nil;
[audio_session setCategory: AVAudioSessionCategoryPlayAndRecord error:&audio_session_err];
NSLog(@"!");
UInt32 audioRouteOverride = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,sizeof (audioRouteOverride),&audioRouteOverride);
UInt32 allowMixing = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);
if (audio_session_err)
{
NSLog(@"audioSession: %@ %d %@", [audio_session_err domain], [audio_session_err code], [audio_session_err description]);
}
else
{
audio_session_err = nil;
[audio_session setActive:YES error:&audio_session_err];
if (!audio_session_err) NSLog(@"audio session is activated successfully");
}
Ayúdame a descubrir por qué se bloquea en iOS 4.3 con el extraño error. ¡Gracias!
Tal vez puedas probar el fragmento de código a continuación
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];
NSError * audio_session_err = nil;
[audio_session setCategory: AVAudioSessionCategoryPlayAndRecord error:&audio_session_err];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&audio_session_err];
[[AVAudioSession sharedInstance] setDelegate:self];
NSLog(@"!");
UInt32 audioRouteOverride = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,sizeof (audioRouteOverride),&audioRouteOverride);
UInt32 allowMixing = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);
if (audio_session_err) {
NSLog(@"audioSession: %@ %d %@", [audio_session_err domain], [audio_session_err code], [audio_session_err description]);
} else {
audio_session_err = nil;
[[AVAudioSession sharedInstance] setActive:YES error:&audio_session_err];
if (!audio_session_err) NSLog(@"audio session is activated successfully");
}
Creo que audio_session = [[AVAudioSession sharedInstance] retain];
despacha el método setMode:
por defecto. Y el setMode:
solo está disponible en iOS 5.0 y posterior (consulte el Doc
).
O puede intentar comentar el código:
UInt32 audioRouteOverride = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,sizeof (audioRouteOverride),&audioRouteOverride);
UInt32 allowMixing = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);
Debe haber un método que setMode:
de manera predeterminada. Pruébalo. :pag
Pruebe info malloc 0x706a7f0
en su gdb para obtener el objeto al que se envió el selector. Tenga en cuenta que 0x706a7f0
es la dirección que se muestra en su resultado de bloqueo como la que aparece en su primer fragmento de código.
Y otro consejo, puede make clean
(Poduct-> Clean) y rebuild
.
En tiempo de ejecución, se invocan muchos métodos que no están en su código, pero que se llaman detrás de escena como resultado de las llamadas API que ha realizado.
Me centraría no en el método que se llama, sino en por qué el objeto al que se envía no puede responder al selector. El objeto podría haberse lanzado como el tipo incorrecto y, por lo tanto, no hereda los métodos correctos. (En el fragmento de código que muestra, no emite explícitamente AVAudioSession *audio_session
). La otra dirección es comprobar que no está utilizando ninguna otra llamada API que sea iOS 5 solamente, que en el fondo llama a este método y generando el error
Finalmente, si recientemente ha cambiado su objetivo de compilación para incluir iOS 4.3, puede que simplemente necesite hacer una compilación limpia (Producto> Limpiar) para que compile el código compatible con iOS 4.3.