iOS AVPlayer 在应用程序后台然后屏幕锁定后不播放播放列表中的下一首歌曲
iOS AVPlayer Does Not Play the Next Song in a Playlist After App is Backgrounded Then Screen is Locked
我正在开发这个 iOS 应用程序,它可以播放来自 URL 的音乐。目前,当应用处于前台、后台甚至屏幕锁定时通过播放列表播放都没有问题,仅当应用在锁定前处于前台时。
如果应用程序在后台运行然后锁屏,下一首歌曲将加载,但不会播放。
我的问题是:当应用程序处于后台且屏幕被锁定时,如何让 AVPlayer 播放列表中的下一首歌曲?
下面是我用来加载和播放歌曲的代码...
- (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;
}
}
在尝试使用一些控制台日志和断点进行调试后,我已验证肯定会调用 [self.player play] 并且每次都会加载正确的 URL。
我的 info.plist 文件为所需的背景模式启用了音频和提取。
当应用程序已后台且屏幕已锁定时,下一首歌曲似乎根本无法播放。
如有任何见解或建议,我们将不胜感激。谢谢。
编辑
这似乎是一个间歇性问题,自 iOS 9.3 发布以来出现频率大大降低,这让我相信这可能与 OS...?
有关
玩两遍就可以了
玩家?.play()
玩家?.play()
我正在开发这个 iOS 应用程序,它可以播放来自 URL 的音乐。目前,当应用处于前台、后台甚至屏幕锁定时通过播放列表播放都没有问题,仅当应用在锁定前处于前台时。
如果应用程序在后台运行然后锁屏,下一首歌曲将加载,但不会播放。
我的问题是:当应用程序处于后台且屏幕被锁定时,如何让 AVPlayer 播放列表中的下一首歌曲?
下面是我用来加载和播放歌曲的代码...
- (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;
}
}
在尝试使用一些控制台日志和断点进行调试后,我已验证肯定会调用 [self.player play] 并且每次都会加载正确的 URL。
我的 info.plist 文件为所需的背景模式启用了音频和提取。
当应用程序已后台且屏幕已锁定时,下一首歌曲似乎根本无法播放。
如有任何见解或建议,我们将不胜感激。谢谢。
编辑 这似乎是一个间歇性问题,自 iOS 9.3 发布以来出现频率大大降低,这让我相信这可能与 OS...?
有关玩两遍就可以了
玩家?.play()
玩家?.play()