Я использую AVAudioSession для записи в сопутствующем приложении MFi, но я могу заставить запись работать только тогда, когда приложение находится на переднем плане, а не когда приложение находится в фоновом режиме или когда экран телефона заблокирован. Я использую код из здесь. Отличие только в том, что я изменил категорию с AVAudioSessionCategoryRecord
на AVAudioSessionCategoryPlayAndRecord
. Я на самом деле пробовал оба, но не повезло:
NSError *error;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession AVAudioSessionCategoryPlayAndRecord withOptions:audioSession.categoryOptions|AVAudioSessionCategoryOptionAllowBluetooth
error:&error];
[audioSession setActive:YES error:nil];
NSLog(@"Data sources: %@", [audioSession availableInputs]);
// Data sources: ("<AVAudioSessionPortDescription: 0x1706071b0, type = MicrophoneBuiltIn; name = iPhone Microphone; UID = Built-In Microphone; selectedDataSource = Bottom>",
"<AVAudioSessionPortDescription: 0x170611bd0, type = BluetoothHFP; name = Dan\U2019s AirPods; UID = 50:32:37:E0:90:37-tsco; selectedDataSource = (null)>"
for (AVAudioSessionPortDescription *desc in [audioSession availableInputs]){
NSLog(@"Port desc: %@", desc.portType);
// Loop: 1) Port desc: MicrophoneBuiltIn
// 2) Port desc: BluetoothHFP
if (desc.portType == AVAudioSessionPortBluetoothHFP) {
NSLog(@"Trying to change preferred input");
NSError *error;
BOOL didSet = [audioSession setPreferredInput:desc error:&error];
NSString *didSetString = didSet ? @"True" : @"False";
NSLog(@"Post change preferred input: %@, error: %@", didSetString, error);
// Post change preferred input: True, error: (null)
}
}
Я также убедился, что «аудио» было добавлено в UIBackgroundModes. .
Когда приложение находится в фоновом режиме, я вижу, что HFP открывается при записи из журналов телефона:
default 17:39:44.628437 -0800 bluetoothd Bluetooth Daemon: HFP streaming to device 3C7FBB65: on
default 17:39:44.637577 -0800 bluetoothd HFP stream started: Enabling diversity/TxBF
Но когда приложение находится в фоновом режиме, я вижу только это в журнале телефона:
-[NSDictionary(XPCObject) _cs_xpcObject]_block_invoke Cannot encode non-plist types into XPC object : <AVAudioSessionRouteDescription: 0x105704410,
inputs = (
"<AVAudioSessionPortDescription: 0x105704b50, type = BluetoothHFP; name = DEVICE_NAME; UID = AC:63:BE:CF:CB:2C-tsco; selectedDataSource = (null)>"
);
outputs = (
"<AVAudioSessionPortDescription: 0x106005040, type = BluetoothHFP; name = DEVICE_NAME; UID = AC:63:BE:CF:CB:2C-tsco; selectedDataSource = (null)>"
)>
Я предполагаю, что канал HFP не открывается, когда запись инициируется в фоновом режиме приложения.
Насколько я понимаю, Apple/iOS запрещает приложению инициировать запись голоса, когда приложение работает в фоновом режиме, независимо от того, подключено ли устройство BT. У меня вопрос: может ли устройство BT открыть канал HFP, чтобы, когда приложение вызывает AVAudioSession для записи, голосовой поток подхватывался AVAudioSession?