2014-05-16 7 views
7

Sto utilizzando AVPlayer per implementare un lettore video personalizzato in un'applicazione iOS. Per riprodurre il video dalla rete ho assegnare un giocatore:In che modo AVPlayer/AVPlayerItem informa la mia applicazione in merito a un errore di rete irraggiungibile?

[[AVPlayer alloc] initWithURL:_URL]; 

Creare una risorsa:

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.URL 
options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)}]; 

caricare la chiave playable in modo asincrono:

NSArray *keys = @[@"playable"]; 
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     for (NSString *key in keys) { 
      NSError *error; 
      AVKeyValueStatus status = [asset statusOfValueForKey:key error:&error]; 

      if (status == AVKeyValueStatusFailed) { 
       NSLog(@"Failed to load asset key %@ error %@", key, [error localizedDescription]); 
       [self fail]; 
       return; 
      } 
     } 

     if (asset.isPlayable) { 
      [self.player replaceCurrentItemWithPlayerItem:self.playerItem]; 
     } 
     else { 
      [self fail]; 
     } 
    }); 
}]; 

Il problema è che quando il dispositivo è dotato di nessuna connessione Internet o perdita di pacchetti elevata, il completionHandler non viene mai chiamato (anche dopo aver atteso per minuti) e quindi non ho idea di quando mostrare un messaggio all'utente che carica g il video non è riuscito.

Le mie domande sono:

  1. mi sto perdendo qualcosa/c'è un modo migliore per gestire questa situazione?
  2. In caso di rollout della mia logica di timeout o dovrei semplicemente non loadValuesAsynchronouslyForKeys: quando Reachability ritiene che la rete non sia raggiungibile.
  3. Quali sono le migliori pratiche relative a AVPlayer e guasti di rete?

risposta

1

Si scopre che questo potrebbe essere stato messo in relazione al modo in cui ero test. L'utilizzo del condizionatore Network Link non ha attivato il blocco, ma quando ho effettivamente bloccato l'host utilizzando Charles Proxy, tutto ha funzionato come previsto. Sto cercando di andare con il mio codice originale per ora, e aggiungerò alcune delle idee di Dan se si rivelasse ancora problematico durante i test sul mondo reale

1

Ho integrato AVAsset prima, ma non ho incontrato questo specifico problema. Tuttavia, ecco cosa farei:

  1. Impostare un timer o un invio di blocco ritardato per la durata del timeout che si desidera applicare.
  2. Controllare il valore del tasto "riproducibile" con statusOfValueForKey:error:.
  3. Se lo stato non è AVKeyValueStatusLoaded o l'errore non è nullo, chiamare [asset cancelLoading] e visualizzare un messaggio di errore per l'utente o qualsiasi ripulitura che potrebbe essere necessario fare.
4

Si dovrebbe essere osservando caratteristiche (KVO) del AVPlayerItem che rivelano come il buffer sta facendo, come playbackBufferEmpty ecc

Problemi correlati