¿Cómo usar AVAssetResourceLoader?

La documentation dice sobre AVURLAsset.resourceLoader:

Durante la carga, se puede pedir al object cargador de resources que ayude en la carga de un recurso. Por ejemplo, un recurso que requiere desencryption puede hacer que el cargador de resources solicite las keys de desencryption apropiadas. Puede asignar un object de delegado al object de cargador de resources y usar su delegado para interceptar estas requestes y proporcionar una respuesta adecuada.

Entonces, lo que bash hacer en mi código es:

NSURL* url = ...; _asset = [[AVURLAsset alloc] initWithURL:url options:nil]; AVAssetResourceLoader* loader = _asset.resourceLoader; [loader setDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)]; _playerItem = [AVPlayerItem playerItemWithAsset:_asset]; _player = [AVPlayer playerWithPlayerItem:_playerItem]; // ... setting up the player layer [_player play]; 

y también en mi class agrego AVAssetResourceLoaderDelegate a @interface y también implemento el método:

 - (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest { NSLog(@"YES"); return YES; } 

Cualquiera que sea la URL que se pasa, este método nunca se recibe. No se mide si la URL es un medio válido a través de HTTP, o si utilizo mi protocolo NSURL registrado personalizado.

¿Cuándo se supone que el resourceLoader llame a su delegado?

Debe intentar usar un esquema de URL personalizado, por ejemplo: en lugar de http://myserver.com/listen.m3u use my_custom_scheme://myserver.com/listen.m3u . Apple maneja por defecto HTTP y HTTPS para que no se llame al delegado. Para omitir esto, debe usar un esquema personalizado para forzar la llamada para los methods delegates.

Probablemente necesite replace resourceLoader como:

 AVAssetResourceLoader* resource_loader = [some_AVAsset resourceLoader]; [resource_loader setDelegate:your_resource_data_loader queue:your_dispatch_queue];