SKAction playSoundFileNamed не работает после двух последовательных телефонных звонков

Я пытаюсь понять, почему playSoundFileNamed не работает после двух последовательных телефонных звонков. На самом деле он работает только после того, как получен первый телефонный звонок. Шаги воспроизведения:

  • Начать игру
  • Дождитесь телефонного звонка и перейдите в фоновый режим.
  • Телефонный вызов завершен (отклонен или прерван абонентом)
  • Возврат на передний план

После этого воспроизведение звука с touchhesBegan по-прежнему работает.

Когда я повторяю шаги сверху (первый шаг пропускается), механизм от touchhesBegan перестает работать. Не знаю, почему это происходит... Вот код, который может привести к описанному поведению:

@interface GameScene()

@property (nonatomic, strong) SKAction *sound;
@end

@implementation GameScene

-(void)didMoveToView:(SKView *)view {
    self.sound = [SKAction playSoundFileNamed:@"sound1.wav" waitForCompletion:NO];
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */
    [self runAction:self.sound];
}
@end

Я знаю, что есть некоторые вопросы, связанные с этим на SO, но ответы на них связаны с обходными решениями. Меня не интересует обходной путь, но почему это происходит?. Это как-то связано с AVAudioSession? (возможно, нет) Я знаю, что я мог бы использовать AVAudioPlayer в качестве обходного пути, но все же не уверен, насколько это исполнитель для воспроизведения множества простых коротких звуков...

Ответ 1

SKAction playSoundFileNamed является ошибкой в ​​отношении перехода приложения между фоном и передним планом. Это причина, почему у вас эта проблема. Я не уверен, исправлена ​​ли эта проблема в iOS 9.

Что касается обходного пути, вы заявили, что не заинтересованы, но я включу его для завершения. Используйте AVAudioPlayer вместо SKAction. AVAP имеет возможность останавливаться и запускаться (используя своих делегатов) в зависимости от состояния вашего приложения.

Ответ 2

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

try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)