No se puede get una notificación al conectar un accesorio externo a la toma de auriculares de 3.5 mm

He intentado hacer que esto funcione por un time. He hecho todo lo que dicen en la documentation y todavía no tengo nada.

Este es el código en el delegado de mi aplicación que se registra para las notifications locales:

- (void) registerForLocalNotifications { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_accessoryConnected:) name:EAAccessoryDidConnectNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_accessoryDisconnected:) name:EAAccessoryDidDisconnectNotification object:nil]; [[EAAccessoryManager shanetworkingAccessoryManager] registerForLocalNotifications]; } 

Lo anterior se llama desde applicationDidFinishLaunching.

Aquí está el código de los methods de connection / desconnection:

 - (void) _accessoryConnected:(NSNotification *)notification { NSLog(@"_accessoryConnected"); } - (void) _accessoryDisconnected:(NSNotification*)notification { NSLog(@"_accessoryDisconnected"); } -(void) accessoryDidDisconnect:(EAAccessory *) accessory { NSLog(@"accessoryDidDisconnect"); } 

Intenté conectar los auriculares que vienen con el iPhone y no obtuve nada, igual para mi accesorio externo que quiero integrar con la aplicación.

Por favor ayuda, gracias, Shaul.

Debería usar AudioSessionPropertyListener para esto. Las notifications de EAA son para hardware que se conecta al puerto de 30 pines. Agregue este oyente en viewDidLoad y elimínelo en ViewDidUnLoad

 AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioSessionPropertyListener, nil); 

Agregue los siguientes methods en el controller de vista.

 BOOL isHeadsetPluggedIn() { UInt32 routeSize = sizeof (CFStringRef); CFStringRef route; OSStatus error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, &routeSize, &route ); NSLog(@"%@", route); return (!error && (route != NULL) && ([(NSString*)route rangeOfString:@"Head"].location != NSNotFound)); } void audioSessionPropertyListener(void* inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void* inData) { UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; // Determines the reason for the route change, to ensure that it is not // because of a category change. CFDictionaryRef routeChangeDictionary = inData; CFNumberRef routeChangeReasonRef = CFDictionaryGetValue (routeChangeDictionary,CFSTR (kAudioSession_AudioRouteChangeKey_Reason)); SInt32 routeChangeReason; CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason); // "Old device unavailable" indicates that a headset was unplugged, or that the // device was removed from a dock connector that supports audio output. if (routeChangeReason != kAudioSessionRouteChangeReason_OldDeviceUnavailable) return; if (!isHeadsetPluggedIn()) { AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); } else { UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); } } 

Tenga en count que obtuve este código desde hace mucho time y funcionó para mí. No puedo atribuir la fuente ahora, ya que no sé de dónde la obtuve.