2016-03-21 6 views
1

Ich arbeite an dieser iOS App, die Musik von URLs abspielt. Derzeit hat es keine Probleme, eine Playlist abzuspielen, während die App im Vordergrund, im Hintergrund oder sogar dann, wenn der Bildschirm gesperrt ist, NUR WENN die App vor dem Sperren im Vordergrund war.iOS AVPlayer spielt den nächsten Song in einer Playlist nicht ab, nachdem die App den Hintergrund hat Der Bildschirm ist gesperrt

Wenn die App im Hintergrund läuft DANN ist der Bildschirm gesperrt, der nächste Song wird geladen, aber nicht abgespielt.

Meine Frage ist: Wie bekomme ich den AVPlayer den nächsten Song in einer Liste zu spielen, während die App im Hintergrund ist und der Bildschirm gesperrt ist?

Unten ist der Code ich die Songs zu laden und abzuspielen bin mit ...

- (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; 
    } 
} 

Nach dem Versuch, mit einigen Konsolenprotokollen und Bruchstellen zu debuggen, ich habe festgestellt, dass [self.player play] wird definitiv aufgerufen und die korrekte URL wird jedes Mal geladen.

In meiner Datei info.plist sind Audio und Fetch für die erforderlichen Hintergrundmodi aktiviert.

Der nächste Song scheint einfach nicht zu spielen, wenn die App im Hintergrund läuft und der Bildschirm gesperrt ist.

Alle Einblicke oder Vorschläge würden sehr geschätzt werden. Vielen Dank.

EDIT Dies scheint ein intermittierendes Problem zu sein, die häufig seit der Veröffentlichung von iOS viel weniger erscheint 9.3, die ich kann glauben, führt dies zu den OS in Verbindung gebracht hat ...?

+0

können Sie ein Beispielprojekt teilen? –

+0

Dies ist nur ein kleines Stück einer viel größeren App und dieses Stück Code war nicht wirklich auf ein anderes Projekt (zumindest nicht absichtlich), so dass ich kein Beispielprojekt zu teilen ... gibt es noch etwas, das ich könnte helfen, auf eine Lösung hinzuweisen? –

+0

Ich habe etwas sehr sehr ähnliches erlebt. Es ist nur passiert, wenn ich auf iOS 9.3 und Xcode 7.3 aktualisiert habe. Wenn ein Song endet und die App sich im Hintergrund befindet und der Bildschirm gesperrt ist, wird der nächste Song geladen und 'player.play()' wird aufgerufen, aber die 'player.rate' bleibt auf 0. Sehr frustrierend, ich frage mich, ob das etwas ist mit iOS 9.3 machen. Ich habe sogar eine Hintergrundaufgabe geöffnet, um sicherzustellen, dass die App nicht in die Schwebe kommt, immer noch kein Glück – MikeG

Antwort

0

Es funktioniert, wenn Sie es zweimal spielen.

Spieler? .play()

Spieler? .play()

Verwandte Themen