esta aplicación fue desarrollada y funciona bien en ios 5.0, pero se bloquea en ios 4.3

Desarrollé una aplicación de iPhone con iOS 5.0, y funciona bien. Pero cuando se trata de iOS 4.3 (Base SDK = más reciente iOS 5.0, comstackdor = Apple LLVM 3.0, Despliegue Objetivo = iOS 4.3), se bloquea después del lanzamiento.

La salida alnetworkingedor del punto de locking 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 function de miembro setMode:error: mientras la invocaba. Pero lo que es extraño es que no setMode:error: una function cuyo nombre es setMode:error: El código sobre el procesamiento de audio es:

 audio_session = [[AVAudioSession shanetworkingInstance] 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"); } 

Por favor, ayúdame a descubrir por qué se bloquea en iOS 4.3 con el extraño error. ¡Gracias!

En time de ejecución, se invocan muchos methods que no están en su código, pero que se invocan entre bastidores como resultado de las llamadas a la API que ha realizado.

Me centraría no en el método al que se llama, sino en por qué el object al que se envía no puede responder al selector. El object podría haberse emitido como el tipo incorrecto y, por lo tanto, no está henetworkingando los methods correctos. (En el fragment de código que se muestra, no se emite explícitamente AVAudioSession *audio_session ). La otra dirección es comprobar que no está utilizando alguna otra llamada API que solo sea iOS 5, que en segundo plano llama a este método y generando así el error.

Finalmente, si recién has cambiado tu objective de compilation para include iOS 4.3, es posible que simplemente necesites hacer una compilation limpia (Producto> Limpio) para que compile el código compatible con iOS 4.3.

Tal vez puedas probar el fragment de código a continuación.

 [[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError]; NSError * audio_session_err = nil; [audio_session setCategory: AVAudioSessionCategoryPlayAndRecord error:&audio_session_err]; [[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryPlayback error:&audio_session_err]; [[AVAudioSession shanetworkingInstance] 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 shanetworkingInstance] setActive:YES error:&audio_session_err]; if (!audio_session_err) NSLog(@"audio session is activated successfully"); } 

Creo que audio_session = [[AVAudioSession shanetworkingInstance] retain]; envía el método setMode: de forma pnetworkingeterminada. Y el setMode: solo está disponible en iOS 5.0 y versiones posteriores (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 distribuye setMode: de forma pnetworkingeterminada. Pruebe usted mismo :pag


Pruebe la info malloc 0x706a7f0 en su gdb para get el object al que se envió el selector. Tenga en count que 0x706a7f0 es la dirección que se muestra en su salida de locking como la que se encuentra en el primer fragment de código.

Y otro consejo, puede make clean (Poduct-> Clean) y rebuild .

El método AVAudioSession

 - (BOOL)setMode:(NSString *)theMode error:(NSError **)outError 

Está marcado en la documentation como disponible solo para iOS 5 y posteriores. De hecho, dada la reciente incorporación de modos a la documentation , parece que los modos de session de audio no están disponibles antes de iOS 5.