29 votes

iPhone UIWebView chargement lent des fichiers HTML locaux

Je développe une application qui nécessite la mise en cache de pages web (complètement) avec leurs fichiers CSS et leurs images après avoir sauvegardé l'ensemble du HTML de la page (en passant par les liens pour stocker chaque fichier avec le fichier HTML).

Lors de l'affichage du fichier HTML hors ligne, UIWebView prend beaucoup de temps pour charger la page, étant donné que je suis déjà hors ligne et que le fichier se trouve sur le disque avec ses CSS et ses images.

J'utilise ce code pour charger le fichier :

  NSData *htmlData = [NSData dataWithContentsOfFile:htmlFilePath];
  [wView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL fileURLWithPath:self.htmlFolderPath isDirectory:YES]];

Existe-t-il un autre moyen de charger le fichier dans l'application UIWebView qui peut le charger plus rapidement ?

P.S : il se charge très rapidement sur le simulateur (hors ligne) mais sur l'appareil il prend beaucoup de temps (compte tenu du fait qu'il s'agit d'un fichier déjà mis en cache hors ligne).

Merci de votre aide.

7voto

ACBurk Points 3460

Votre solution consiste-t-elle à mettre en cache des éléments autres que le fichier html, c'est-à-dire des images, des fichiers css, etc. et à les relier à la page html ? Je suppose que vous téléchargez et mettez en cache la page html et les ressources externes, puis que l'UIWebView charge cette page html et continue à charger les ressources externes. Cela expliquerait les performances rapides sur le simulateur et les performances plus lentes sur l'appareil.

Voici une bibliothèque conçue pour faire exactement ce que vous essayez de faire : ASIWebPageRequest .

Il convient également de noter qu'il peut s'agir simplement d'un goulot d'étranglement au niveau de l'entrée/sortie du disque. Je sais que sur mon projet, je chargeais de grandes images dans un uitableview et même après qu'elles aient été mises en cache, j'ai remarqué un certain décalage lorsqu'elles ont été extraites du disque en raison de leur taille.

4voto

foz Points 3258

J'ai constaté que certains types de feuilles de style en cascade (CSS) peuvent paralyser le rendu des vues Web. Par exemple :

body { -webkit-box-shadow:inset 0 0 100px #222; }

Cela fonctionne très bien dans le simulateur, et c'est aussi très joli. Mais sur le téléphone (même l'iPhone 4, iOS 4.2), le rendu d'une simple page prend 10 secondes.

3voto

mvds Points 26475

Comme cela prend probablement du temps parce qu'il faut analyser et rendre la page, vous pouvez envisager de lancer l'UIWebView en arrière-plan, c'est-à-dire de l'ajouter en tant que sous-vue, mais sans qu'elle soit visible.

Peut-être que l'UIWebView est suffisamment intelligent pour savoir qu'il n'a rien à faire, mais je soupçonne qu'au moins l'analyse html et css est effectuée immédiatement.

S'il ne fait rien sans être visible, réduisez la taille à 1x1 et définissez l'opacité=0, et placez ce pixel à un endroit où il ne peut pas interférer avec la gestion des événements tactiles.

Ce n'est pas parfait, mais cela peut fonctionner.

1voto

Tim Points 5911

Je suis presque sûr que vous ne pourrez jamais le faire. L'UIWebView a juste besoin d'un peu de temps pour traiter votre page web, même s'il s'agit d'une page locale.

En gardant cela à l'esprit, vous pouvez essayer de précharger la page avant qu'elle ne soit affichée. Par exemple, si vous l'affichez après que l'utilisateur a appuyé sur un bouton, préchargez la page lorsque vous affichez le bouton et non lorsque l'utilisateur appuie sur le bouton. L'utilisateur ne remarque pas la lenteur du chargement, car il est géré en arrière-plan, de sorte que lorsque l'utilisateur appuie sur le bouton, la page est déjà chargée.

0voto

djsumdog Points 1030

Je peux vous donner une idée des autres façons de charger le HTML d'un fichier dans l'UIWebView. Un petit projet que j'ai réalisé utilise Objective-C comme une pure enveloppe pour UIWebView.

Le projet est ici, mais le code principal est ci-dessous : http://github.com/robb1e/iWeb

- (void)viewDidLoad {
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"html" inDirectory:@"."]];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];
    [super viewDidLoad];
}

J'étudie également les moyens d'améliorer la performance perçue en affichant une image pendant que le DOM se prépare. Voici quelques réponses que j'ai reçues :

Affichage d'une image de fond sur UIWebView

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