Come posso utilizzare UIWebView in Xcode in modo che quando carica pagine non FAI scaricare le immagini (per causare una pagina di caricamento più veloce)?iPhone SDK: UIWebView per interrompere le immagini dal caricamento/download
risposta
UIWebView
è una pallida, povera piccola ombra del completo WebView
di WebKit, per cui è facile. -webView:shouldStartLoadWithRequest:navigationType:
viene chiamato solo per la navigazione. Non viene chiamato per ogni richiesta come WebPolicyDelegate
su mac. Con UIWebView
, ecco come vorrei attaccare questo problema:
Implementare -webView:shouldStartLoadWithRequest:navigationType:
e impostarlo per restituire sempre NO
. Ma dovrai anche rispondere e generare un NSURLConnection
. Quando lo NSURLConnection
termina il recupero dei dati, lo esaminerai per eventuali tag IMG e li modificherai in qualsiasi segnaposto desideri. Quindi caricherete la stringa risultante nello UIWebView
utilizzando -loadHTMLString:baseURL:
.
Ovviamente l'analisi dell'HTML non è un compito banale su iPhone, e i caricatori Javascript ti daranno dei problemi, quindi questa non è una risposta perfetta, ma è la migliore che io conosca.
Sii il delegato per l'UIWebView, poi intercetta la chiamata:
– webView:shouldStartLoadWithRequest:navigationType:
controllare i valori delle navigationType nella documentazione. Credo che ti verrà servito meglio restituendo NO
su navigationType == UIWebViewNavigationTypeOther
.
in questo modo la pagina viene caricata più velocemente? sembra che le immagini siano ancora in fase di download, ma non le stiamo semplicemente fornendo a UIWebView.
oppure dovrebbeStartLoadWithRequest caricare prima il testo HTML?
espandendo la risposta di Rob. Ho notato che quando loadHTMLString: baseURL: e restituiva sempre NO, quel webView: shouldStartLoadWithRequest: navigationType: continua a essere chiamato. (Suppongo che loadHTMLString invochi un altro shouldStartLoadWithRequest).
quindi quello che dovevo fare era alternano tra il ritorno SI/NO e ho usato NSScanner per analizzare il codice HTML e il cambiamento src = "http: // ..." per 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;
}
webView: shouldStartLoadWithRequest: navigationType: viene chiamato dopo il download. – Harry