SKAction playSoundFileNamed ne fonctionne pas après avoir reçu deux appels téléphoniques consécutifs

J'essaie de comprendre pourquoi playSoundFileNamed ne fonctionne pas après avoir reçu deux appels téléphoniques consécutifs. En fait, cela ne fonctionne qu'après la réception du premier appel téléphonique. Les étapes de reproduction sont:

  1. Démarrer un jeu
  2. Attendre un appel téléphonique et passer en arrière-plan
  3. L'appel téléphonique est terminé (refusé ou interrompu par l'appelant)
  4. Revenir au premier plan

Après cela, jouer le son de touchesBegan fonctionne toujours.

Lorsque je répète les étapes ci-dessus (la première étape est ignorée), le mécanisme de touchesBegan cesse de fonctionner. Je ne sais pas pourquoi cela se produit … Voici le code qui peut produire un comportement décrit:

@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 

Je sais qu'il y a quelques questions liées à cela sur SO, mais étant donné les réponses sont liées à des solutions de contournement. Je ne suis pas intéressé par une solution de contournement, mais plutôt pourquoi cela se produit-il? Est-ce lié d'une manière ou d'une autre à AVAudioSession? (probablement pas) Je sais que je pourrais utiliser AVAudioPlayer comme une solution de contournement, mais je ne sais pas encore combien cela est performant pour jouer beaucoup de sons courts simples …

Le SKAction playSoundFileNamed est buggé en ce qui concerne la transition de l'application entre l'arrière-plan et le premier plan. C'est la raison pour laquelle vous avez ce problème. Je ne suis pas sûr si ce problème a été corrigé dans iOS 9.

En ce qui concerne une solution de contournement, vous avez déclaré que vous n'êtes pas intéressé mais je vais en inclure un pour l'amour de l'achèvement. Utilisez AVAudioPlayer au lieu de SKAction. AVAP a la capacité de s'arrêter et de démarrer (en utilisant ses delegates) en fonction de l'état de votre application.