2016-03-21 1 views
1

Je travaille sur cette application iOS qui lit la musique à partir d'URL. Actuellement, il n'a aucun problème à jouer à travers une liste de lecture alors que l'application est mise au premier plan, arrière-plan, ou même lorsque l'écran est verrouillé SEULEMENT SI l'application était au premier plan avant le verrouillage.iOS AVPlayer ne lit pas le morceau suivant dans une liste de lecture après la mise en arrière de l'application, puis l'écran est verrouillé

Si l'application est en arrière-plan alors que l'écran est verrouillé, la chanson suivante se chargera, mais elle ne sera pas lue.

Ma question est: Comment puis-je faire en sorte que l'AVPlayer joue la chanson suivante dans une liste pendant que l'application est en arrière-plan et que l'écran est verrouillé?

Ci-dessous le code que je utilise pour charger et lire les chansons ...

- (void)loadNextSong { 
    if (self.playlistIndex < self.playlist.count-1) { //check to see if the next track is in bounds of the playlist array 
     self.playlistIndex++; 
     [self.player pause]; 
     [self serviceDidFetchSong:self.playlist[self.playlistIndex]]; 
     [self.player play]; 

    } else { //play the first song if we reach the end of the playlist 
     self.playlistIndex = 0; 
     [self.player pause]; 
     [self serviceDidFetchSong:self.playlist[self.playlistIndex]]; 
     [self.player play]; 
     } 
    } 

- (void)serviceDidFetchSong:(Song *)song { 
    if (song.audioFileURL != nil) { 

     if (![self.song.audioFileURL isEqual:song.audioFileURL]) { 
      if (self.timeIntervalObserver) { 
       [self.player removeTimeObserver:self.timeIntervalObserver]; 
      } 

      AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:song.audioFileURL options:0]; 
      AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithAsset:asset]; 

      self.player = [[AVPlayer alloc] initWithPlayerItem:playerItem]; 

      //this is just for a visual of the song progress 
      __block __weak SongPlayerViewController *blockSelf = self; 
      self.timeIntervalObserver = [self.player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds((1.0f/5.0f), NSEC_PER_SEC) 
                        queue:NULL 
                      usingBlock:^(CMTime time){ 
                       [blockSelf updateProgressBar]; 
                      }]; 
     } 

     self.song = song; 
    } 
} 

Après avoir essayé de débogage avec certains journaux de la console et des points de rupture, j'ai vérifié que [self.player jeu] est définitivement appelé et que l'URL correcte est chargée à chaque fois.

Mon fichier info.plist a l'audio et l'extraction activés pour les modes d'arrière-plan requis.

La chanson suivante ne semble pas du tout jouée lorsque l'application a été mise en arrière-plan et que l'écran est verrouillé.

Toute idée ou suggestion serait grandement appréciée. Je vous remercie.

EDIT Cela semble être un problème intermittent qui apparaît beaucoup moins fréquemment depuis la sortie d'iOS 9.3 qui me conduit à croire que ce pourrait être liée à l'OS ...?

+0

pouvez-vous partager un exemple de projet? –

+0

Ceci est juste un petit morceau d'une application beaucoup plus grande et ce morceau de code n'était pas vraiment basé sur un autre projet (du moins pas intentionnellement), donc je n'ai pas un exemple de projet à partager ... Y at-il autre chose? pourrait fournir pour aider à pointer vers une solution? –

+0

Je vis quelque chose de très très similaire. Seulement survenu lorsque j'ai mis à jour vers iOS 9.3 et Xcode 7.3. Quand une chanson se termine, et l'application est en arrière-plan avec l'écran verrouillé, la chanson suivante est chargée et 'player.play()' est appelé, mais le 'player.rate' reste à 0. Extrêmement frustrant je me demande si c'est quelque chose à faire avec iOS 9.3. J'ai même ouvert une tâche de fond pour m'assurer que l'application ne tombe pas en suspension, toujours pas de chance – MikeG

Répondre

0

Fonctionne lorsque vous jouez deux fois.

joueur? .play()

joueur? .play()