当应用程序处于后台时,iOS之间暂停执行代码然后恢复

时间:2014-09-22 15:06:28

标签: ios background avplayer

我正在构建一个需要播放曲目列表的应用,但是在每首歌曲之间音乐应该暂停以执行一些代码,然后一旦完成,音乐应该恢复。当应用程序在后台以及前台时,这需要工作。

我尝试了几种方法,但似乎没有人能够做我想做的一切。

AVQueuePlayer - 我似乎无法确定任何一首歌何时停止,只有在整个队列停止时才会停止。

AVPlayer - 我可以通过通知确定音轨何时结束,然后我可以运行我的额外代码,然后加载下一首曲目。只要应用程序不在后台,当应用程序在后台时代码执行正常,除了[avPlayer play]命令不起作用,这样就可以正常工作。它不会抛出错误,它根本就不会播放。我知道它已经移动到下一首歌并将其加载到AVPlayer中,因为我输出了元数据并且已经移动了。

为了清楚初始轨道确实在后台运行,它只是启动下一个不在后台运行的轨道。

以下代码......

知道我做错了什么吗?

谢谢!

+(void) playItem {
    //get the play item from the song array based on intSongIndex
    MPMediaItem *currentSong = [songsNowPlaying objectAtIndex:intSongIndex];
    AVPlayerItem * currentItem = [AVPlayerItem playerItemWithURL:[currentSong valueForProperty:MPMediaItemPropertyAssetURL]];
    [avPlayer replaceCurrentItemWithPlayerItem:currentItem];

    //add notification to the currentItem
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerItemDidReachEnd:)
                                             name:AVPlayerItemDidPlayToEndTimeNotification
                                           object:currentItem];

    //play
    [avPlayer play];

    NSArray *metadataList = [[avPlayer currentItem].asset commonMetadata];
    for (AVMetadataItem *metaItem in metadataList) {
        NSLog(@"%@: %@",[metaItem commonKey], [metaItem value]);
    }

    //increment song index so next time the next song is selected
    intSongIndex ++;
    if (intSongIndex >= songsNowPlaying.count) {
        intSongIndex = 0;
    }
}

+ (void)playerItemDidReachEnd:(NSNotification *)notification {
    //add code to be executed before the next song plays

     //call playItem to play the next song
    [self playItem];
}

1 个答案:

答案 0 :(得分:0)

解决了,这需要添加到初始viewDidLoad

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];