iPhone SDK: UIWebView для остановки загрузки / скачивания изображений.

Как я могу использовать UIWebView в Xcode, чтобы при загрузке страниц он НЕ загружал изображения (чтобы страница загружалась быстрее)?

Ответов (4)

Решение

UIWebView это бледная, бедная тень полного WebKit WebView, для которого это легко. -webView:shouldStartLoadWithRequest:navigationType: вызывается только для навигации. Он не вызывается для каждого запроса, как WebPolicyDelegate на Mac. С UIWebView, вот как я бы атаковать эту проблему:

Реализуйте -webView:shouldStartLoadWithRequest:navigationType: и настройте его всегда возвращать NO . Но вы также примете запрос и создадите NSURLConnection . Когда NSURLConnection завершится выборка данных, вы просмотрите их на предмет наличия каких-либо тегов IMG и измените их на любой заполнитель, который вы хотите. Затем вы загрузите полученную строку в файл UIWebView using -loadHTMLString:baseURL: .

Конечно, синтаксический анализ HTML - нетривиальная задача на iPhone, и загрузчики Javascript доставят вам проблемы, так что это не идеальный ответ, но это лучшее, что я знаю.

Станьте делегатом UIWebView, а затем перехватите вызов:

– webView:shouldStartLoadWithRequest:navigationType:

Проверьте значения navigationType в документации. Я считаю , что вы будете лучше всего, вернувшись NO на navigationType == UIWebViewNavigationTypeOther .

действительно ли это заставляет страницу загружаться быстрее? похоже, что изображения все еще загружаются, но мы просто не загружаем их в UIWebView.

или shouldStartLoadWithRequest сначала загружает текст HTML?

расширяя ответ Роба. Я заметил, что когда loadHTMLString: baseURL: и всегда возвращает NO, этот webView: shouldStartLoadWithRequest: navigationType: просто продолжает вызываться. (я подозреваю, что loadHTMLString вызывает другой shouldStartLoadWithRequest).

поэтому мне нужно было поочередно возвращать ДА / НЕТ, и я использовал NSScanner для анализа HTML и изменения src = "http: // ..." на src = ""

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if (pageHasNoImages==YES)
    {
        pageHasNoImages=FALSE;
        return YES;     
    }
    NSString* newHtml;
    NSString* oldHtml;
    NSData *urlData;
    NSURLResponse *response;
    NSError *error;
    urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    oldHtml=[[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding];

    newHtml=[self.detail scannerReplaceImg:oldHtml]; // my own function to parse HTML
    newHtml=[self.detail scannerReplaceAds:newHtml]; // my own function to parse HTML
    if (newHtml==nil) 
    {
        NSLog(@"newHtml is nil");
        newHtml=oldHtml;
    }
    [oldHtml release];

    pageHasNoImages=TRUE;
    [web loadHTMLString:newHtml baseURL:request.URL];

    return NO;
}