Подтвердить что ты не робот

Ввод фона на iOS4 для воспроизведения аудио

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

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

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

Итак, мой вопрос: что они делают, что мне не хватает? Нужно ли мне также использовать своих новых делегатов или вызвать звук на applicationDidEnterBackground? Для меня это не имеет смысла, так как я не сохраняю состояние (они делают для меня с быстрым переключением приложений) или действительно обрабатывают что-либо на заднем плане, отличное от аудио, которое, как они говорят, должно обрабатываться автоматически.

4b9b3361

Ответ 1

Одна часть, отсутствующая в документации, вам нужно установить сеанс аудио.

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

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

Ответ 2

Вам также необходимо выполнить вызовы 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;
}