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

Использование пользовательского NSURLProtocol в iOS для файла://URL-адреса приводят к ошибке "Прерывание кадров"

Я хочу загрузить измененные файлы в UIWebView, и я хочу, чтобы они были загружены по схеме file://, поэтому я мог включить в мою страницу другие файлы://resources (например, видеотексты html5). Для этого я реализую свой собственный NSURLProtocol и переопределяет загрузку подмножества файлов://URL.

Мой метод startLoading выглядит примерно так:

- (void) startLoading {
    ... data is populated ...
    [protocolClient URLProtocol:self didLoadData:data];
    [protocolClient URLProtocolDidFinishLoading:self];
}

Это отлично работает на iOS4/5, но на iOS 6 beta 4. Я получаю следующую ошибку:

2012-08-21 16:06:07.236 TemplateApp[57283:1d403] 57283: CFNetwork internal error (0xc01a:/SourceCache/CFNetwork_Sim/CFNetwork-606/Connection/URLConnectionClient.cpp:2341)
/SourceCache/WebCore_Sim/WebCore-1634/wak/WKView.mm:385 void WKViewAddSubview(WKViewRef, WKViewRef):  invalid parameter
2012-08-21 16:06:07.272 TemplateApp[57283:1e603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSSetM addObject:]: object cannot be nil'
*** First throw call stack:
(0x29d0552 0x2733e7e 0x2a5dc08 0x69c6c1e 0x69c4c88 0x69c543b 0x5b40dbd 0x5b40f0f 0x5b3c240 0x5ff8060 0x5ff75d1 0x5eb8d08 0x65a4fb2 0x678486f 0x677fa3d 0x7b3ab1 0x7b2d63 0x7f0e5a 0x2972ebd 0x7f14dc 0x7f1455 0x6db410 0x29544ff 0x2953f2f 0x2976cf4 0x2976504 0x29763db 0x69d0530 0x907caed9 0x907ce6de)
libc++abi.dylib: terminate called throwing an exception

Я решил это, добавив вызов didReceiveResponse к моему методу startLoading следующим образом:

- (void) startLoading {
    ... data is populated ...
    [protocolClient URLProtocol:self didReceiveResponse:[[NSURLResponse alloc] init] cacheStoragePolicy:NSURLCacheStorageAllowed]
    [protocolClient URLProtocol:self didLoadData:data];
    [protocolClient URLProtocolDidFinishLoading:self];
}

Однако теперь на iOS 5 и 6 я получаю следующую ошибку при попытке загрузить страницу:

Webview error: Error Domain=WebKitErrorDomain Code=102 "Frame load interrupted" UserInfo=0x9d4c0a0 {NSErrorFailingURLKey=file:///src/index.html, NSErrorFailingURLStringKey=file:///src/index.html, NSLocalizedDescription=Frame load interrupted}

Я пробовал различные объекты NSURLResponse в методе didReceiveResponse, но ни один из них не позволял WebView загружать страницу. Использование схемы URL, отличной от файла://также работает, но тогда я не могу использовать путь к файлу://для встроенных ресурсов, таких как видео HTML5.

Есть ли способ загрузить динамический контент для определенного файла://URL в UIWebView, который работает на iOS 6 beta 4?

4b9b3361

Ответ 1

В настоящее время у меня возникают другие проблемы с загрузкой содержимого в UIWebView, но я думаю, вам нужно использовать NSURLResponse initWithURL:MIMEType:expectedContentLength:textEncodingName:

В противном случае я не думаю, что у вас есть действительный объект ответа. Проблема, с которой я сталкиваюсь, заключается в том, что я получаю "плохой URL", до того, как будет вызван мой startLoading.

UPDATE: я получил его сейчас, видимо, мой canonicalRequestForRequest: был тупой

Ответ 2

В этом тоже. Вот работа, которая, как мне кажется, работает, но не работает с history.back() и требует глобальной ссылки на UIWebView.

- (void)startLoading {
    NSURL* insteadURL = ...;
    NSURLRequest* request = [self request];
    BOOL isTopLevelNavigation = [request.URL isEqual:request.mainDocumentURL];

    // iOS 6+ just gives "Frame load interrupted" when you try and feed it data via a URLProtocol.
    if (isTopLevelNavigation) {
        [gWebView loadData:[NSData dataWithContentsOfURL:insteadURL] MIMEType:@"text/html" textEncodingName:@"utf8" baseURL:[request URL]];
    } else {
        ...
    }
}