¿Cómo AVPlayer / AVPlayerItem informa a mi aplicación acerca de fallas de networking inalcanzables?

Estoy usando AVPlayer para implementar un reproductor de video personalizado en una aplicación iOS. Para reproducir video desde la networking asigno un reproductor:

 [[AVPlayer alloc] initWithURL:_URL]; 

Crea un activo:

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

cargue la tecla playable forma asíncrona:

 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]; } }); }]; 

El problema es que cuando el dispositivo no tiene connection a Internet o alta pérdida de packages, nunca se llama a completionHandler (incluso después de esperar minutos) y no tengo idea de cuándo mostrar un post al usuario que cargue el video.

Mis preguntas son:

  1. ¿Me estoy perdiendo algo / hay una mejor manera de manejar esto?
  2. ¿Debería desarrollar mi propia lógica de time de espera o simplemente no loadValuesAsynchronouslyForKeys: cuando Reachability cree que la networking no es accesible.
  3. ¿Cuáles son las mejores prácticas con respecto a AVPlayer y fallas de networking?

Debería estar observando (KVO) las características del AVPlayerItem que muestran cómo está funcionando el almacenamiento intermedio, como playbackBufferEmpty etc.

Resulta que esto puede estar relacionado con la forma en que estaba probando. El uso del acondicionador de enlace de networking no activó el locking, pero cuando bloqueé el host utilizando Charles Proxy, todo funcionó según lo previsto. Estoy tratando de ir con mi código original por ahora, y agregaré algunas de las ideas de Dan si resulta ser aún problemático durante las testings del mundo real.

He integrado AVAsset antes, pero no me he encontrado con este problema específico. Sin embargo, esto es lo que haría:

  1. Establezca un timer o un envío de bloque diferido para la duración del time de espera que desee aplicar.
  2. Compruebe el valor de la tecla "jugable" con statusOfValueForKey:error:
  3. Si el estado no es AVKeyValueStatusLoaded o el error no es nulo, llame [asset cancelLoading] y muestre un post de error al usuario o la limpieza que necesite hacer.