2014-10-04 11 views
10

Ho un'app che riproduce lo streaming audio da un server SHOUTcast. Tutto funziona correttamente quando l'app è in primo piano e il blocco automatico è disabilitato. L'app è comunque anche in grado di riprodurre audio in background, questa funzione ha sempre funzionato bene su iOS 6 e iOS 7. Ma ora i miei utenti segnalano che l'audio in background si interrompe dopo circa 10 minuti dall'aggiornamento a iOS 8.iOS 8 interrompe lo streaming audio in background dopo 10 minuti

Sono in grado di riprodurre il problema da solo eseguendo semplicemente l'app su iOS 8. Poiché l'app stessa è piuttosto complicata, ho realizzato una semplice demo per mostrare il problema. Sto usando Xcode 6 e Base SDK è impostato su iOS 8. Ho aggiunto audio a UIBackgroundModes nel mio Info.plist. Qualcuno sa cosa c'è di sbagliato con il codice qui sotto?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    NSURL *streamingURL = [NSURL URLWithString:@"http://www.radiofmgold.be/stream.php?ext=pls"]; 

    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:streamingURL]; 
    [self setPlayerItem:playerItem]; 

    AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; 
    [player setAllowsExternalPlayback:NO]; 

    [self setPlayer:player]; 
    [player play]; 

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
    [[AVAudioSession sharedInstance] setActive: YES error: nil]; 

    return YES; 
} 
+0

Si prega di condividere la correzione se ne trovate uno. Anche i miei utenti segnalano questo problema. Non posso riprodurlo – RawMean

+0

Inizialmente non ero in grado di riprodurre il problema poiché il problema non si verificava con tutti i collegamenti di streaming. Lo streaming nel mio codice tuttavia si interrompe sempre dopo dieci minuti mentre funzionava perfettamente su iOS 7. Davvero fastidioso poiché questo streaming è la funzionalità principale della mia app e sono sopraffatto da recensioni a una stella e reclami da parte degli utenti in questo momento . Metterò una taglia su questa domanda al più presto, ma temo che questo sia un bug da parte di Apple. Spero davvero di poter risolvere il problema da solo ... La mia app si basa fondamentalmente su questa funzionalità. – s1m0n

+0

Ciao ragazzi, sto vivendo lo stesso problema. Mi sembra che Apple l'abbia fregato. Nel mio caso, il tempo che intercorre tra la fine del flusso e la riproduzione varia molto (5 minuti fino a 12 minuti). Sembra che il flusso improvvisamente perde la connessione e quindi riproduce finché non esaurisce i dati memorizzati nel buffer. Accade quando App è in primo piano e quando è in background. L'unico modo per gestirlo è osservare lo stato di AVPlayerItem. Lo posterò come risposta. – Hendrik

risposta

6

Ho riscontrato lo stesso problema in iOS 8.0.2. La mia sorgente audio remota viene riprodotta in mp3. Sembra che un errore interno stia riavviando AVAudioSession. È possibile gestirlo in diversi modi:

È possibile osservare lo stato di AVPlayerItem.

void* YourAudioControllerItemStatusContext = "YourAudioControllerItemStatusContext"; 
... 
@implementation YourAudioController 
... 
- (void)playStream { 
    ... 
    AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:streamUrl]; 
    [item addObserver:self forKeyPath:@"status" options:0 context:MJAudioControllerItemStatusContext]; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if (context == YourAudioControllerItemStatusContext) { 
     AVPlayerItem *item = object; 
     if (item.status == AVPlayerItemStatusFailed) { 
      [self recoverFromError]; 
     } 
    } 

In questo modo sembra non essere affidabile dal momento che non ci può essere un ritardo immenso finché lo stato della AVPlayerItem cambia - se cambia affatto.

I debug attraverso observeValueForKeyPath e scoperto che lo stato della AVPlayerItem cambia a AVErrorMediaServicesWereReset e ha un codice di errore -11.819 set.

Dal momento che ho riscontrato l'errore AVErrorMediaServicesWereReset, ho ricercato che cosa causa questo errore: è l'AVAudioSession che impazzisce. Facendo riferimento allo Technical Q&A di Apple, è necessario registrarsi per AVAudioSessionMediaServicesWereResetNotifications. Metti che da qualche parte nel codice:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionWasReset:) name:AVAudioSessionMediaServicesWereResetNotification object:nil]; 

Quindi aggiungere questo metodo:

- (void)audioSessionWasReset:(NSNotification *)notification { 
    [self recoverFromError]; 
} 

Nel metodo recoverFromError provare una delle seguenti opzioni:

  • mostrano un avviso che descrive che theres un problema sotto iOS 8 e lo streaming deve essere riavviato
  • riavviare il flusso impostando di nuovo AVAudioSession attivo e creare un'istanza di un nuovo Istanza di AVPlayer con un nuovo AVPlayerItem

Al momento sono gli unici modi in cui so come gestirlo. La domanda è: perché AudioSession viene riavviato.

UPDATE Il rilascio di iOS 8.1 cuciture di aver risolto il problema.

5

ho anche sperimentato lo stesso problema, e hanno testato questo su un iPhone 5s con iOS 8.0.2 e un iPad Mini Retina esecuzione iOS 8.1 beta 2, significa che questo non è fisso nella prossima versione beta. Entrambi hanno smesso di riprodurre l'audio dopo circa 30 minuti.

Quando AVPlayer.status == AVPlayerItemStatusFailed è possibile disconnettersi da AVPlayer.status per ulteriori dettagli sull'errore. Ricevo:

Error Domain=AVFoundationErrorDomain Code=-11819 "Cannot Complete Action" UserInfo=0x178a75bc0 {NSLocalizedDescription=Cannot Complete Action, NSLocalizedRecoverySuggestion=Try again later.}

Anche quando si cerca di prendere questo e arrestare e avviare il mio lettore, ho poi ricevere un errore fatale per dirmi che l'AVPlayer è stato deallocato. A questo punto potrebbe essere utile provare a reinizializzare una nuova istanza di AVPlayer come suggerito da Hendrik. Ciò non risolve il fatto che l'audio si interromperà temporaneamente quando tenterai di reinizializzarlo. AVPlayer potrebbe anche ricevere notifiche prima di poter reinizializzarlo, il che significa che riceverai un errore fatale; questo è lontano da una soluzione permanente.

Forse qualcun altro avrà più fortuna con questo e può fornire una soluzione più concreta. Nel frattempo, ho anche segnalato questo bug ad Apple.

Aggiornamento 15 ottobre 2014: Apple ha chiuso la segnalazione di bug con questo stato: Duplicato di 18152675 (Chiuso).

4

sembra che è fissato in iOS 8.1

+0

Sì, ho eseguito il codice di esempio nella domanda e lo streaming è continuato per 30 minuti (dopodiché l'ho interrotto manualmente). Mi chiedo perché questo bug di iOS 8.0 non abbia influito su Pandora e Spotify. – RawMean

0

Questo problema sembrano essere stati fissati con l'aggiornamento iOS8.1. L'ho aggiornato ieri ed è stato in grado di eseguire lo streaming per 45 minuti, mentre prima dell'aggiornamento, si sarebbe schiantato entro 10-15 minuti.