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 クラスを作成します。