7 votes

UIWebView : retard dans le chargement du contenu local

J'affiche une petite quantité de contenu local dans une UIWebView, environ 3 paragraphes de texte et une image de 100x100px. Lorsque l'UIWebView est poussé vers le contrôleur nav, il faut environ une demi-seconde avant que le contenu ne soit affiché. Cela se produit sur l'appareil, pas dans le simulateur. Il est évident que l'UIWebView doit effectuer un certain travail avant d'afficher le contenu, mais y a-t-il un moyen de le faire avant que la vue poussée n'apparaisse ? Je n'ai pas réussi à le faire moi-même.

C'est ici que je crée et pousse le contrôleur de vue qui contient le UIWebView :

ArticleViewController* viewController = [[ArticleViewController alloc] init];
viewController.article = article;
[viewController view]; //touch the view so it gets loaded
[viewController loadWebView]; //load the web view content
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];

Et voici le loadWebView méthode :

-(void)loadWebView {
    NSString *path = [[NSBundle mainBundle] bundlePath];
    NSURL *baseURL = [NSURL fileURLWithPath:path];

    NSString* content = article.content;

    NSString *html = [NSString stringWithFormat:@"\
                      <html><body style='background-color: transparent'><style type=""text/css"">body {font-family: helvetica; color: black; font-size: 10pt; margin: 10px 10px 10px 10px}</style>\
                      %@<div style='text-align:center'><a href='13443574_9709e4cf37.jpg?photographer=test' style='-webkit-tap-highlight-color:rgba(0,0,0,0);'><img src='13443574_9709e4cf37.jpg' height='160' width='230'></a></div></body></html>", content];
    [self.webView loadHTMLString:html baseURL:baseURL];
}

Auparavant, j'avais [viewController loadWebView] dans la méthode viewDidLoad, mais le résultat semble être le même. Un écran vide lorsque le viewController est poussé, suivi du chargement du contenu une demi-seconde plus tard.

Des idées ?

13voto

Basil Bourque Points 8938

Problème confirmé

Moi aussi, je constate un délai d'une demi-seconde ou plus avec un écran blanc avant que mon UIWebView apparaît. Cela ne se produit que lors de la première utilisation d'un UIWebView au cours de l'exécution de l'application. Les apparitions successives d'UIWebView sont presque instantanées. Il me semble donc, ainsi qu'à d'autres personnes, que le délai doit être dû à WebKit qui doivent être chargées et initialisées.

Échauffement WebKit

Il n'est pas possible d'éliminer le retard. Mais vous pouvez déplacer ce délai au début de votre application, afin d'atténuer l'effet gênant de "l'écran vide" pour vos utilisateurs. L'astuce consiste à charger UIWebView avec une fausse page hors écran, lors du lancement de votre application. Construire une application minimale HTML5 dans une chaîne de caractères codée en dur. J'utilise un contenu HTML5 correct et valide pour minimiser le temps d'analyse de UIWebView/WebKit.

Cette technique fonctionne remarquablement bien sur du matériel réel ( iPhone 3GS ), et pas seulement les Simulateur iOS .

Dans les délégués de mon application didFinishLaunchingWithOptions méthode , le bas de la ARC -Le code conforme ressemble à ceci :

…
[self.window makeKeyAndVisible];

// Performance optimization: Warm up the UIWebView widget and its related WebKit libraries.
// We are choosing the trade-off between (A) a slight delay here during app launch to create and abandon a bogus UIWebView instance, and
// (B) a flash of white and noticeable delay as the UINavigationController slides in from the right the first UIWebView we display during the app run.
UIWebView* bogusWebView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
NSString* html = @"<!doctype html><html lang=en><head><meta charset=utf-8><title>blah</title></head><body><p>bogus content</p></body></html>";
[bogusWebView loadHTMLString:html baseURL:nil]; // Load the page.
bogusWebView = nil; // Not really needed, but self-documents that we intend to discard this object.

return YES;

Cette technique semble réduire en grande partie, mais pas totalement, le délai d'environ une demi-seconde lors de la première apparition de l'UIWebView à l'écran par l'utilisateur. J'en conclus que la majeure partie du délai est due à l'échauffement de WebKit, mais qu'il doit y avoir une certaine surcharge liée à la présentation graphique d'un UIWebView à l'écran. Si c'est le cas, nous ne pouvons pas éliminer cette surcharge restante avec un travail hors écran. Néanmoins, cette technique permet d'éliminer le plus du délai initial. Ainsi, la première impression de l'utilisateur sur mon application ne sera pas "lente".

1voto

Ben Gottlieb Points 59900

Vous allez faire attendre l'utilisateur, la seule question est de savoir si c'est avant ou après l'apparition de la vue web. Si vous optez pour "avant", vous devez créer le contrôleur, charger la vue web, mais attendre pour la pousser que la méthode déléguée -webViewDidFinishLoad : se déclenche. Une fois que vous avez reçu cette méthode, vous pouvez pousser la vue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X