Comment router vers kAudioSessionProperty_OverrideCategoryEnableBluetoothInput sans utiliser AudioSessionSetProperty

Mon iOS6 et le code de travail pour définir Bluetooth comme une sortie:

// create and set up the audio session AVAudioSession* audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory: AVAudioSessionCategoryPlayAndRecord error: nil]; [audioSession setActive: YES error: nil]; // set up for bluetooth microphone input UInt32 allowBluetoothInput = 1; OSStatus stat = 0; stat = AudioSessionSetProperty ( kAudioSessionProperty_OverrideCategoryEnableBluetoothInput, sizeof (allowBluetoothInput), &allowBluetoothInput ); 

La méthode AudioSessionSetProperty est obsolète depuis iOS7. Suite à ce sujet Comment puis-je router l'audio vers un haut-parleur sans utiliser AudioSessionSetProperty? vous pouvez changer la sortie en AVAudioSessionPortOverrideSpeaker OU AVAudioSessionPortOverrideNone mais pas d'options Bluetooth ici.

Mon objective réel est de prendre en charge les appareils Bluetooth qui n'utilisent pas A2DP mais HFP.

Alors, comment puis-je y parvenir sans utiliser de methods obsolètes?

Pour développer ma réponse précédente et commenter :

Vous utiliseriez la méthode AVAudioSession

 - (BOOL)setCategory:(NSSsortingng *)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError 

avec category comme
AVAudioSessionCategoryPlayAndRecord
ou AVAudioSessionCategoryRecord

et les options
AVAudioSessionCategoryOptionAllowBluetooth

Dans votre réponse, vous dites

ce n'est pas la même parce que cela permettrait A2DP bluetooth seulement

Mais selon les docs d'Apple

AVAudioSessionCategoryOptionAllowBluetooth
Permet aux périphériques mains libres Bluetooth d'apparaître en tant que routes d'input disponibles.

Je comprends que pour signifier bluetooth HFP, ce que je présume est ce que vous cherchez. En ce qui concerne le «forcing», Apple ne tient pas trop aux applications qui forcent / supplantent le contrôle du operating system de l'expérience du comportement d'un user.

Il se peut que cela ne marche pas dans la pratique – je n'ai pas pu le tester. Vraisemblablement vous avez, et il échoue (vous n'indiquez pas dans votre question). Mais vous atteignez les limites de la documentation d'Apple sur ce problème. Si vous ne pouvez vraiment pas le faire fonctionner, je serais enclin à aller avec l'interface C obsolète, et être prêt à faire des changements pour iOS8.

En me référant à cette réponse , j'ai trouvé ce qui suit:

  [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&error]; NSArray* routes = [audioSession availableInputs]; for (AVAudioSessionPortDescription* route in routes) { if (route.portType == AVAudioSessionPortBluetoothHFP) { [audioSession setPreferredInput:route error:nil]; } } 

Il semble fonctionner de la même manière que l'ancienne propriété override et redirige à la fois l'input et la sortie du périphérique mains libres.