Ввод фона на iOS4 для проигрывания аудио

Документация скорее плохо записана при разговоре о проигрывании аудио в фоновом режиме. Это производит впечатление, что все, что необходимо сделать, чтобы продолжить играть аудио, которое Вы в настоящее время играете, должно просто добавить пару ключ/значение к info.plist файл и wallah, это волшебно.

Однако дело обстоит не так. Например, если я играю mp3, который 2 минуты длиной, очевидно, аудио достаточно длинно, чтобы смочь играть после того, как я нажал кнопку "Домой" для отправки моего приложения в фон. Вещь, даже при том, что у меня есть та пара ключ/значение в моем info.plist файл, это приостанавливает аудио и затем продолжает играть, после того как я переключаюсь назад на приложение.

Apple заявляет, что все платформы для аудио фона поддержки и звука должны продолжить играть вплоть до точки, которую она заканчивает, и затем Apple приостановит Ваше приложение.

Так, мой вопрос: Что они делают это, я отсутствую? Сделайте я также должен использовать их новых делегатов так или иначе или обратиться к аудио applicationDidEnterBackground? Мне, который не имел бы смысла, так как я не сохраняю состояние (они делают для меня с быстрым переключением приложения), или действительно обработка чего-либо в фоновом режиме кроме аудио, которое, как они говорят, как предполагается, обрабатывается автоволшебно.

18
задан iwasrobbed 1 July 2010 в 21:00
поделиться

2 ответа

Единственное, чего не хватает в документации, это то, что вам нужно настроить аудиосеанс.

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

Добавьте это, и все будет хорошо.

17
ответ дан 30 November 2019 в 07:12
поделиться

Вам также нужно сделать вызовы beginBackgroundTaskWithExpirationHandler: перед началом композиции (делайте это постоянно, независимо от того, на переднем плане или нет) и endBackgroundTask, когда она закончится.

Это говорит iOS, что вы хотите иметь возможность продолжать обработку, даже если ваше приложение перейдет в фоновый режим. Это не создает новую задачу или поток, это просто флаг для iOS, что вы хотите продолжать работу. Звук будет воспроизводиться до конца и без этого, но когда он завершится, если вы захотите запустить другой трек, вы должны иметь возможность работать в фоновом режиме.

Вы можете использовать это следующим образом:

// ivar, initialized to UIBackgroundTaskInvalid in awakeFromNib
UIBackgroundTaskIdentifier bgTaskId; 

При запуске аудиоплеера мы сохраняем идентификатор задачи bg:

if ([audioPlayer play]) {
  bgTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
}

Теперь обратный вызов audioPlayerDidFinishPlaying: все равно произойдет, потому что мы сообщили iOS, что выполняем задачу, которая должна продолжаться, даже если нас переведут в фоновый режим. Таким образом, мы получим обратный вызов и сможем запустить следующий аудиофайл.

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)success
{
    UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;

    if (self.haveMoreAudioToPlay) {
        newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
        [self playNextAudioFile];
    }

    if (bgTaskId != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask: bgTaskId];
    }

    bgTaskId = newTaskId;
}      
22
ответ дан 30 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: