У меня есть приложение для потоковой передачи музыки с использованием класса 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