2011-11-09 20 views
13

Estoy trabajando con WebView, que carga sus contenidos desde cierta ubicación, como el entorno limitado. Así que agregué una clase secundaria simple de NSURLProtocol para manejar esos archivos. El controlador de protocolo administrará el esquema de URL como "dummy:". Cuando probé url personalizado como dummy: ///index.html, esto debería cargar index.html desde un directorio local. Htmls e imágenes incrustadas, etc. funcionó bien.La clase NSURLProtocol personalizada para WebView no funciona al cargar video en el documento HTML5

Pero cuando probé un archivo html incluye un reproductor de video HTML5 usando la etiqueta, no funciona. WebView incluso no probó el método canInitWithRequest: solicitud en mi clase personalizada para el archivo de video.

@interface DummyURLProtocol : NSURLProtocol { 
} 

+ (BOOL)canInitWithRequest:(NSURLRequest *)request; 
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request; 
+ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b; 
- (void)startLoading; 
- (void)stopLoading; 

@end 

@implementation DummyURLProtocol 

+(BOOL)canInitWithRequest:(NSURLRequest *)request { 
    return [[[request URL] scheme] isEqualToString:@"dummy"]; 
} 

+(NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { 
    return request; 
} 

+(BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b { 
    return [[[a URL] resourceSpecifier] isEqualToString:[[b URL] resourceSpecifier]]; 
} 

-(void)startLoading { 
    NSURL *url = [[self request] URL]; 
    NSString *pathString = [url resourceSpecifier]; 
    NSString *path = [NSString stringWithFormat:@"/Users/cronos/tmp/video_demo/%@", pathString]; 
    NSString *fullFilename = [pathString lastPathComponent]; 
    NSString *extention = [fullFilename pathExtension]; 
    NSString *mimeType = [[SSGHTMLUtil sharedUtil] mimeTypeForExtension:extention]; 
    NSLog(@"DummyURLProtocol:FILEPATH: %@ EXTENSION: %@ MIME-TYPE: %@", path, extention, mimeType); 


    NSURLResponse *response = [[NSURLResponse alloc] initWithURL:url MIMEType:mimeType expectedContentLength:-1 textEncodingName:nil]; 
    FILE *fp = fopen([path UTF8String], "r"); 
    if (fp) { 
     char buf[32768]; 
     size_t len; 
     [[self client] URLProtocol:self 
       didReceiveResponse:response 
       cacheStoragePolicy:NSURLCacheStorageNotAllowed]; 
     while ((len = fread(buf,1,sizeof(buf),fp))) { 
      [[self client] URLProtocol:self didLoadData:[NSData dataWithBytes:buf length:len]]; 
     } 
     fclose(fp); 
    } 
    [[self client] URLProtocolDidFinishLoading:self]; 
} 

-(void)stopLoading { 
} 

@end 

que registró el controlador de protocolo en applicationDidFinishLaunching: en AppDelegate.m

if ([NSURLProtocol registerClass:[DummyURLProtocol class]]) { 
    NSLog(@"URLProtocol registration successful."); 
} else { 
    NSLog(@"URLProtocol registration failed."); 
} 

entonces probé mi vista web con la URL "dummy: ///HTML5_Video.html". Otros recursos como archivos javascript, archivos css, imágenes se cargan con éxito, pero el archivo mp4 no se pasó al DummyURLProtocol. HTML5_Video.html incluye lo siguiente.

<video preload="metadata"> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=676422 --> 
    <source src="assets/dizzy.mp4" type="video/mp4" /> 
    <source src="assets/dizzy.webm" type="video/webm" /> 
    <source src="assets/dizzy.ogv" type="video/ogv" /> 
    </video> 

¿Alguna idea o un buen punto de partida para resolver este problema?

Gracias.

+1

Hola Estoy teniendo problema con la costumbre NSURLProtocol con el nuevo Clase WKWebView. ¿Alguien intentó hacer eso? no carga las páginas ficticias: //. –

Respuesta

8

Sí. No funcionará

He archivado errores con Apple hace más de un año.

vídeo y otros tipos de multimedia, incluyendo SVG no pasan por el mecanismo NSURLProtocol

Ver http://openradar.appspot.com/8446587

y http://openradar.appspot.com/8692954

+0

¿qué hay de usar el esquema http: pero usando un encabezado personalizado? –

+0

¡gracias por la respuesta! – cronos

+1

He golpeado la misma barricada. Tuve que ir con un servidor web incorporado (CocoaHTTPServer) para servir archivos multimedia a la aplicación (desde la aplicación) – TrekOnTV2017

Cuestiones relacionadas