воспроизведение аудиоплеера iphone iOS5 не вызывается блокировкой экрана?

#cocoa-touch #ios5 #avaudioplayer #sleep

#cocoa-touch #ios5 #avaudioplayer #сон

Вопрос:

У меня есть серия аудиофайлов, которые я хочу воспроизвести последовательно. Я настраиваю метод делегирования audioPlayerDidFinishPlaying для запуска следующего файла в последовательности. Это работает без проблем, если я отключу блокировку экрана или запущу ее на эмуляторе или на устройстве iOS4. Однако, когда я запускаю его на отключенном устройстве, iOS5, экран заблокирован, он останавливается после первой дорожки. Есть ли какой-нибудь способ запустить новую звуковую дорожку после включения блокировки экрана?

Вот мой базовый код

 // Registers this class as the delegate of the audio session.
[[AVAudioSession sharedInstance] setDelegate: self];

// Use this code instead to allow the app sound to continue to play when the screen is locked.
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];

UInt32 doSetProperty = 0;
AudioSessionSetProperty ( kAudioSessionProperty_OverrideCategoryMixWithOthers,
                         sizeof (doSetProperty),
                         amp;doSetProperty
                         );

// Registers the audio route change listener callback function
AudioSessionAddPropertyListener (
                                 kAudioSessionProperty_AudioRouteChange,
                                 audioRouteChangeListenerCallback,
                                 self
                                 );

// Activates the audio session.

NSError *activationError = nil;
[[AVAudioSession sharedInstance] setActive: YES error: amp;activationError];

    NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@"m4a"];  
    float vol = [appSoundPlayer volume];

    AVAudioPlayer * newAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];  
    self.appSoundPlayer = newAudio; // automatically retain audio and dealloc old file if new file is loaded

    [newAudio release]; // release the audio safely

    appSoundPlayer.delegate = self; 
    [appSoundPlayer prepareToPlay];
    [appSoundPlayer setNumberOfLoops:0];
    [appSoundPlayer play];
    [appSoundPlayer setVolume:vol];
    [progTime setProgress:0];
}


   - (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) lappSoundPlayer successfully: (BOOL) flag {
    //... code here to select nex sound track
                    [lappSoundPlayer play];
    }
  

Я уже сделал так, чтобы приложение продолжало воспроизводить текущую дорожку, даже когда включается блокировка экрана, я просто не могу заставить его запустить следующую дорожку.

Примечание: Я подтвердил, что это работало в iOS4.

Ответ №1:

Настроили ли вы категорию аудиосеансов, в частности, AVAudioSessionCategoryPlayback , как описано здесь?

 [[AVAudioSession sharedInstance] setDelegate: self];    
NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:amp;error];
  

Если это не сработает, по словам пользователя ascanio в этом сообщении на форумах разработчиков Apple, еще одна вещь, которую нужно попробовать, — настроить ваше приложение на прослушивание событий удаленного управления:

 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
  

Комментарии:

1. Да, на первый вопрос. Второй вариант выглядит возможным, я проверю это — спасибо!

2. В ходе предварительного тестирования второе решение работает, я назначу заслуженную награду после завершения тестирования.

3. Надеюсь, это сработает! Но я чувствую вину за то, что принял награду, поскольку я только что наткнулся на ваш вопрос и увидел, что никто на него не ответил.

4. Выглядит великолепно, я так рад, что кто-то наконец ответил — не нужно винить себя.

5. Похоже, у меня это не работает… Я пытаюсь продолжить воспроизведение звука и после блокировки экрана, но когда я добавляю этот код, экран блокировки просто останавливает запуск моего приложения в iOS5 .. вы зарегистрировали что-то еще, чтобы разрешить звук?