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.
Hola Estoy teniendo problema con la costumbre NSURLProtocol con el nuevo Clase WKWebView. ¿Alguien intentó hacer eso? no carga las páginas ficticias: //. –