2013-09-04 5 views
2

J'ai écrit une application iOS qui charge une application Web HTML5 dans un UIWebView. J'essaie de faire l'application cache tout dans le UIWebView pour une utilisation sur une connexion 3G plutôt que de tout charger à nouveau.iOS Cache un UIWebView

Il doit suivre tous les liens lors d'une connexion WiFi et télécharger toutes les pages et images. Quand sur une connexion 3G, il devrait alors charger tout à partir du cache.

Est-ce possible? Des idées sur où je devrais commencer? Ai-je besoin de faire en sorte que mon application HTML5 charge toutes les pages en arrière-plan plutôt que de faire en sorte que l'application le fasse?

Merci pour toute aide!

+0

Vous pouvez télécharger les pages en tant que paquet (peut-être même compressé) ou télécharger le code HTML lorsque vous les chargez dans la vue Web et les stockez localement. Ensuite, utilisez Reachability pour détecter si vous avez une connexion WIFI. Si ce n'est pas le chargement de local (de cette façon, il fonctionnera hors ligne ainsi que sur 3G) –

Répondre

3

Premièrement, j'utiliserais Reachability pour détecter s'il y a une connexion WIFI et que votre serveur est accessible. De cette façon, vous pouvez gérer à la fois la connectivité 3G et pas de connexion Internet de la même manière. (accéder aux pages mises en cache). Cela signifie également que vous pouvez utiliser le cache si vous avez WIFI mais ne pouvez toujours pas atteindre votre serveur.

Reachability sample code

Je soit télécharger un fichier zip de vos pages Web et tous les actifs associés (si elle est un site assez statique) et décompressez et de les stocker dans le système de fichiers local. Vous pouvez ensuite pointer votre UIWebView vers le répertoire local lorsqu'il n'y a pas de WIFI.

Vous pouvez utiliser quelque chose comme Zip Archive pour gérer ce

ZipArchive GitHub page

Si ce n'est pas une option, alors vous pouvez obtenir le code HTML de la page lorsque vous chargez dans le UIWebView. Le problème avec cela est que vous dépendez de l'utilisateur pour accéder aux pages afin de les mettre en cache.

Vous pouvez l'utiliser pour obtenir le code HTML et stocker localement:

// Determile cache file path 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *filePath = [NSString stringWithFormat:@"%@/%@", [paths objectAtIndex:0],@"index.html"]; 

// Download and write to file 
NSURL *url = [NSURL URLWithString:@"http://www.google.co.uk"]; 
NSData *urlData = [NSData dataWithContentsOfURL:url]; 
[urlData writeToFile:filePath atomically:YES]; 

// Load file in UIWebView 
[web loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]]; 

Vous pouvez utiliser ce code pour obtenir toutes les pages Web en arrière-plan aussi bien. Pour ce faire, vous devrez soit coder toutes les URL requises et les rechercher individuellement, soit télécharger une liste de pages Web de votre site.

Vous pouvez créer un service Web (JSON est probablement votre meilleure option pour cela) en donnant une liste d'URL à télécharger. Vous pouvez ensuite analyser ce fichier JSON et utiliser les URL pour alimenter le code ci-dessus et mettre en cache le code HTML localement. N'oubliez pas de faire attention avec vos liens hypertextes et vos liens vers les images et les CSS de votre HTML, car cela va casser votre site web en cache si vous cherchez votre URL en ligne complète plutôt qu'un chemin relatif.

+0

Cela semble bon, la plupart du temps les pages ne changeront pas, mais l'application montre des données en direct qui est juste un png retourné par une application Java. Mais en utilisant reachability je peux le faire recharger quand il revient sur une connexion wifi, il semble? –

+0

@ChrisByatt oui vous pouvez utiliser le NSNotification pour obtenir quand l'état d'accessibilité a changé et ensuite l'obtenir pour recharger tout –

+1

@ChrisByatt vous pouvez également utiliser le threading pour exécuter les mises à jour sur un thread séparé si vous ne voulez pas verrouiller le GUI –

Questions connexes