我有一个使用 Matt Gallagher 的 AudioStreamer 类流式传输音乐的应用程序。这可以作为后台进程正常工作,除非我希望能够在流完成后跳到下一首歌曲。不幸的是,这部分不起作用。最初我有一个监视流的计时器,但意识到当应用程序后台运行时,该计时器不再运行。所以我尝试在数据包读取函数中添加一个委托回调:
void ASReadStreamCallBack(CFReadStreamRef aStream, CFStreamEventType eventType, void* inClientInfo)
{
AudioStreamer* streamer = (AudioStreamer *)inClientInfo;
double percent = [streamer progress]/[streamer duration];
if(percent>=0.98 || (percent>=0.95 && [streamer isIdle])){
if([streamer.delegate respondsToSelector:@selector(didFinishPlayingStream:)] ){
[streamer.delegate didFinishPlayingStream:streamer];
streamer.delegate = nil;
}
}
[streamer handleReadFromStream:aStream eventType:eventType];
}
这在应用程序处于前台时工作正常,但在应用程序处于后台时不再工作。委托方法基本上发送一个请求以获取下一首歌曲的流 URL,然后一旦它创建一个新的 AudioStreamer 类