Цель:
Запись звука с телефона в течение 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 мог бы вмешаться и, возможно, дать направление, на котором я должен сосредоточить свои усилия, это было бы невероятно полезно.