Comment utiliser l'UIWebView dans Xcode de sorte que lorsqu'il télécharge des pages, il NE télécharge PAS les images (pour accélérer la page de chargement)?iPhone SDK: UIWebView pour arrêter le chargement/téléchargement des images
Répondre
UIWebView
est une pâle, pauvre petite ombre de plein WebView
de WebKit, pour lequel c'est facile. -webView:shouldStartLoadWithRequest:navigationType:
est seulement appelé pour la navigation. Il n'est pas appelé pour toutes les demandes comme WebPolicyDelegate
sur mac. Avec UIWebView
, voici comment je voudrais attaquer ce problème:
Mettre en œuvre -webView:shouldStartLoadWithRequest:navigationType:
et réglez-le pour toujours retourner NO
. Mais vous devrez également prendre la demande et générer un NSURLConnection
. Lorsque le NSURLConnection
finit d'extraire les données, vous devez rechercher les balises IMG et les modifier dans l'espace réservé souhaité. Ensuite, vous allez charger la chaîne résultante dans le UIWebView
en utilisant -loadHTMLString:baseURL:
.
Bien sûr, l'analyse du code HTML n'est pas une tâche triviale sur iPhone, et les chargeurs Javascript vont vous causer des problèmes, donc ce n'est pas une réponse parfaite, mais c'est le meilleur que je connaisse.
le délégué du UIWebView, puis intercepter l'appel:
– webView:shouldStartLoadWithRequest:navigationType:
Vérifiez les valeurs de NavigationType dans la documentation. Je crois que vous serez mieux servi en renvoyant NO
sur navigationType == UIWebViewNavigationTypeOther
.
Est-ce que cela provoque en fait le chargement plus rapide de la page? il semble que les images sont encore en cours de téléchargement, mais nous ne les fournissons pas à UIWebView.
ou est-ce que shouldStartLoadWithRequest suffit de charger le texte HTML en premier?
en expansion sur la réponse de Rob. J'ai remarqué que lorsque loadHTMLString: baseURL: et toujours renvoyant NO, ce webView: shouldStartLoadWithRequest: navigationType: continue à être appelé. (Je suppose que loadHTMLString invoque un autre shouldStartLoadWithRequest).
donc ce que je devais faire était autre entre le retour OUI/NON et moi NSScanner pour analyser le HTML et le changement 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;
}
webView: shouldStartLoadWithRequest: navigationType: est appelé après le téléchargement. – Harry