У меня есть приложение, которое транслирует музыку с помощью класса 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.