Подтвердить что ты не робот

Пользовательский класс NSURLProtocol для WebView не работает при загрузке видео в документе HTML5

Я работаю с WebView, который загружает его содержимое из определенного места, такого как песочница. Поэтому я добавил простой дочерний класс NSURLProtocol для обработки этих файлов. Обработчик протокола будет управлять схемой URL как "манекен". Когда я пробовал настраивать url как dummy:///index.html, это должно загрузить index.html из локального каталога. Htmls и встроенные изображения и т.д. Отлично работали.

Но когда я попробовал html файл, в него входит HTML5-видеоплеер с тегом, он не работает. WebView даже не пробовал метод canInitWithRequest: запрос в моем пользовательском классе для видеофайла.

@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

Я зарегистрировал обработчик протокола в applicationDidFinishLaunching: в AppDelegate.m

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

то я попробовал свой WebView с URL-адресом "dummy:///HTML5_Video.html". Другие ресурсы, такие как файлы javascript, файлы css, изображения загружаются успешно, но файл mp4 не был передан в DummyURLProtocol. HTML5_Video.html включает следующее.

  <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>

Любые идеи или хорошая отправная точка для решения этой проблемы?

Спасибо.

4b9b3361

Ответ 1

Угу. Это не сработает.

Я зарегистрировал ошибки с Apple более года назад.

Видео и другие типы мультимедиа, включая SVG, не проходят через механизм NSURLProtocol.

См. http://openradar.appspot.com/8446587

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