Начать запись с устройства MFi, когда приложение находится в фоновом режиме

Я использую 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?


person odieatla    schedule 06.02.2021    source источник