Модификация Expo-AV Native Модули Objective-C для обработки прерывания звука во время записи - React Native - PullRequest
0 голосов
/ 23 октября 2019

Цель:

Запись звука с телефона в течение 8 часов подряд, когда приложение находится в фоновом режиме и телефон закрыт. В случае прерывания звука (телефонные звонки, сигналы тревоги, музыка и т. Д.) Приостановите запись во время прерывания, а затем возобновите по окончании прерывания.

Проблема:

AV-библиотека Expo приостанавливает запись при прерывании и не возобновляет работу. Фоновое выполнение кода должно обрабатываться изначально, а не в Javascript.

Сведения о платформе:

Первоначально управляемый Expo рабочий процесс. Теперь выбрасывается в проект ExpoKit.

Попытка решения:

Изменение поведения с минимальным объемом написанного собственного кода путем изменения собственных модулей реагирующей собственной библиотеки Expo AV.

Дополнительная информация:

Здравствуйте,

Я работал над созданием приложения для iOS, предназначенного для записи длинных аудиосеансов (~ 4-8часов) в фоновом режиме и когда телефон закрыт. AV-библиотека Expo отлично работает для начала записи и продолжения записи в фоновом режиме, однако всякий раз, когда происходит прерывание звука (телефонный звонок, будильник, музыка), запись приостанавливается и не возобновляет запись после ее окончания.

Первоначально я работал в управляемом рабочем процессе Expo, но с тех пор перешел в проект ExpoKit, чтобы дать мне больше гибкости с нативной реализацией.

Изначально я надеялся справиться с прерыванием реакцииnative и возобновить запись без необходимости повторного открытия приложения пользователем, но реагирование native в настоящее время не оборудовано для надежного выполнения фонового кода. Вместо этого я пытаюсь изменить нативные модули target-c для библиотеки AV Expo , чтобы обработать прерывание звука изначально (чтобы оно могло происходить в фоновом режиме).

Кажется, согласнона этот пост , я должен следовать Встроенная обработка прерываний аудио от Apple . Я попытался изменить метод handleAudioSessionInterruption в реализации EXAV.m, но не смог изменить поведение по умолчанию.

- (void)handleAudioSessionInterruption:(NSNotification *)notification
{
  NSNumber *interruptionType = [[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey];
  if (interruptionType.unsignedIntegerValue == AVAudioSessionInterruptionTypeBegan) {
    _currentAudioSessionMode = EXAVAudioSessionModeInactive;
  }

  if (interruptionType.unsignedIntegerValue == AVAudioSessionInterruptionTypeEnded) {
    _currentAudioSessionMode = EXAVAudioSessionModeActive;
  }

  [self _runBlockForAllAVObjects:^(NSObject<EXAVObject> *exAVObject) {
    [exAVObject handleAudioSessionInterruption:notification];
  }];
}

Expo предоставляет пример реализации библиотеки записей здесь .

Если бы кто-то с большим опытом разработки под iOS и цели-c мог бы вмешаться и, возможно, дать направление, на котором я должен сосредоточить свои усилия, это было бы невероятно полезно.

...