UIWebView et fichiers HTML locaux

Paisible.frPaisible.fr Membre
janvier 2009 modifié dans API UIKit #1
Bonjour,

J'ai une application avec une UIWebView. Je charge par programmation une page html contenu dans les ressources de l'application. Aucun problème à  ce niveau là . Ma page est chargé et s'affiche.

En revanche quand je clique sur lien de la page pointant sur une autre page contenu dans les ressources de mon bundle rien ne se passe. J'ai une page blanche, pas de 404 ou d'infos pouvant m'aider.

Je précise que je travaille pour le moment avec le simulateur iPhone de xCode.

Réponses

  • Philippe49Philippe49 Membre
    janvier 2009 modifié #2
    Les fichiers qu'une appli peut atteindre dans le bundle sont à  mettre dans le répertoire .../Documents (en priorité)

    Voir ce post


  • Paisible.frPaisible.fr Membre
    06:19 modifié #3
    dans 1231665005:

    Les fichiers qu'une appli peut atteindre dans le bundle sont à  mettre dans le répertoire .../Documents (en priorité)

    Voir ce post


    Ok merci : je vais regarder cela de plus prêt cependant
    1) le /Documents semble êtr destiné plutôt aux documents étant amenés à  être ajoutés, modifiés, supprimer, etc... au fil du temps. Moi il s'agit plutôt du contenu de mon application
    2) J'arrive à  loader dans le UIWebView le fichier HTML contenu dans les ressources par programmation.
    3) Si dans ma page je met un "<a href="http://www.apple.com">apple</a>"; cela fonctionne. Je voudrais la même chose en local. J'ai essayer de faire : href="//mapage.htm", href="/mapage.htm" et href="file://mapage.htm" sans plus de succes.
    4) J'arrive pas à  avoir de trace sur ce qu'il se passe pour essayer de trouver une solution. Rien dans la console. J'ai mis également dans l'émulateur iPhone l'option développeur de safari sur active mais j' ai rien dans mon application qui apparait. Dans Safari la zone développeur apparait en revanche.
  • Philippe49Philippe49 Membre
    06:19 modifié #4
    Oui par programmation pas de problème, les liens sont installés à  la compilation.
    C'est à  l'exécution que les contraintes de localisation des fichiers sont définies strictement par Apple.
  • Paisible.frPaisible.fr Membre
    06:19 modifié #5
    Ok.

    Donc cela signifie que si dans ma UIWebView  j'ai le code suivant :

    <br />...<br />&lt;a href=&quot;sommaire.htm&quot;&gt;sommaire&lt;/a&gt;<br />...<br />
    


    Il va aller chercher en priorité  : .../Documents/sommaire.htm ?
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #6
    dans 1231668681:

    <br />...<br />&lt;a href=&quot;sommaire.htm&quot;&gt;sommaire&lt;/a&gt;<br />...<br />
    

    Il va aller chercher en priorité  : .../Documents/sommaire.htm ?


    Essaie avec l'url complète construite comme indiquée sur le post cité.
    ou bien confie au delegate de ta WebView le soin d'interpréter une telle requête.
  • Philippe49Philippe49 Membre
    06:19 modifié #7
    La doc se trouve dans iPhone Programming Guide > File and Data Management
  • Paisible.frPaisible.fr Membre
    06:19 modifié #8
    Bonjour,

    J'ai enfin trouvé un peu de temps pour faire de nouveaux tests.

    Au lancement de l'application je copie les fichiers de mes ressources dans le dossiers "/Documents" conseillé.
    J'arrive toujours à  ouvrir ma première page, mais impossible de faire fonctionner les liens : toujours le même résultat.
  • Paisible.frPaisible.fr Membre
    06:19 modifié #9
    J'ai poussé les tests en regardant du coté du délégate comme conseillé.

    J'ai donc implémenté les choses suivantes :

    <br />- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType<br />{<br />	NSLog(@&quot;------&gt;shouldStartLoadWithRequest &lt;-----&quot; );<br />	return TRUE;<br />}<br /><br />- (void)webViewDidStartLoad:(UIWebView *)webView<br />{<br />		NSLog(@&quot;webViewDidStartLoad&quot;);<br />	<br />}<br /><br />- (void)webViewDidFinishLoad:(UIWebView *)webView<br />{<br />	NSLog(@&quot;webViewDidFinishLoad&quot;);<br />}<br /><br /><br />- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{<br />	NSLog(@&quot;didFailLoadWithError&quot;);<br />}<br />
    



    Je passe sans problème dans les "webViewDidFinishLoad" et "webViewDidStartLoad".

    En revanche je passe dans le "shouldStartLoadWithRequest" uniquement pour les urls pointant vers le net et pas des fichiers.
  • Paisible.frPaisible.fr Membre
    06:19 modifié #10
    Si je change :

    &lt;a href=&quot;test.htm&quot;&gt;Test JML&lt;/a&gt;
    

    en
    &lt;a href=&quot;file:///test.htm&quot;&gt;Test JML&lt;/a&gt;
    


    Je rentre alors dans le "shouldStartLoadWithRequest". Avec ça je devrais pouvoir prendre la main et peut-être à  faire ce que je souhaite.  :kicking:

    Reste à  trouver le temps pour pousser l'investigation à  son terme  :-\\
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #11
    Il ne reste plus qu'à  transformer le file:///test.htm en le chemin d'accès ".../Documents/test.htm" en remplaçant le ... par ce qu'indique le post indiqué précédemment et logiquement cela devrait passer.
  • Paisible.frPaisible.fr Membre
    janvier 2009 modifié #12
    dans 1232484381:

    Il ne reste plus qu'à  transformer le file:///test.htm en le chemin d'accès ".../Documents/test.htm" en remplaçant le ... parce qu'indiquele post indiqué précédemment et logiquement cela devrait passer.


    Logiquement peut-être, en pratique NON  :(

    Dans ma page html j'ai :
    &lt;a href=&quot;file:///test.htm&gt;test&lt;/a&gt;
    


    Cela semble conforme à  ce qu'indique la documentation d'apple
    The URL loading system provides support for accessing resources using the following protocols:

    File Transfer Protocol (ftp://)
    Hypertext Transfer Protocol (http://)
    Secure 128-bit Hypertext Transfer Protocol (https://)
    Local file URLs (file:///)


    Donc j'implement edans mon delegate la chose suivante (salement) :
    <br />- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType<br />{<br /><br />	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br />	NSString *theUrl = [NSString stringWithFormat:@&quot;%@/inclassables.htm&quot;, [paths objectAtIndex:0]];<br /><br />	NSLog(@&quot;request avant = %@&quot;,request );<br />	request=[NSURLRequest requestWithURL:[NSURL fileURLWithPath:theUrl]];<br />	NSLog(@&quot;request apres = %@&quot;,request );<br />	return TRUE;<br />}<br />
    

    Et là  j'ai une erreur.

    Poussant la curiosité j'implémente :
    <br />- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{<br />	NSLog(@&quot;didFailLoadWithError&quot;);<br />	NSLog(@&quot;Error : %@&quot;, error );<br />}<br />
    


    Qui me donne :

    request avant = <NSMutableURLRequest file:///test.htm>

    request après = <NSURLRequest file://localhost/Users/gnome06/Library/Application%20Support/iPhone%20Simulator/User/Applications/F475E40E-3FBC-4FA5-A224-0E298D41E95B/Documents/test.htm>

    webViewDidStartLoad
    didFailLoadWithError
    Error : Error Domain=NSURLErrorDomain Code=-1100 UserInfo=0x5950b0 "file doesn't exist"



    Si j'ouvre dans safari Mac ou Emulateur iPhone l'url ci-dessous elle fonctionne :
    file://localhost/Users/gnome06/Library/Application%20Support/iPhone%20Simulator/User/Applications/F475E40E-3FBC-4FA5-A224-0E298D41E95B/Documents/test.htm
    
  • Philippe49Philippe49 Membre
    06:19 modifié #13
    dans 1232565837:


    request avant = <NSMutableURLRequest file:///test.htm>

    request après = <NSURLRequest file://localhost/Users/gnome06/Library/Application%20Support/iPhone%20Simulator/User/Applications/F475E40E-3FBC-4FA5-A224-0E298D41E95B/Documents/test.htm>

    webViewDidStartLoad
    didFailLoadWithError
    Error : Error Domain=NSURLErrorDomain Code=-1100 UserInfo=0x5950b0 "file doesn't exist"



    C'est pas lié aux deux barres au lieu de trois barres ?
    file:// et file:///
  • Paisible.frPaisible.fr Membre
    06:19 modifié #14
    dans 1232614129:

    dans 1232565837:


    request avant = <NSMutableURLRequest file:///test.htm>

    request après = <NSURLRequest file://localhost/Users/gnome06/Library/Application%20Support/iPhone%20Simulator/User/Applications/F475E40E-3FBC-4FA5-A224-0E298D41E95B/Documents/test.htm>

    webViewDidStartLoad
    didFailLoadWithError
    Error : Error Domain=NSURLErrorDomain Code=-1100 UserInfo=0x5950b0 "file doesn't exist"



    C'est pas lié aux deux barres au lieu de trois barres ?
    file:// et file:///


    Non, j'ai essaye les deux cas.  :-\\
  • Paisible.frPaisible.fr Membre
    06:19 modifié #15
    Je remonte le problème. J'ai toujours pas trouvé de solution. :-\\
    Si quelqu'un à  une autre idée ou suggestion je suis preneur.

    Je pensais qu'une chose aussi basique puisse poser autant de problème. :'(
  • NoNo Membre
    06:19 modifié #16
    dans 1232815312:

    Je remonte le problème. J'ai toujours pas trouvé de solution.
    Si quelqu'un à  une autre idée ou suggestion je suis preneur.
    Je pensais qu'une chose aussi basique puisse poser autant de problème. :'(


    Quand tu dis "je clique sur lien de la page pointant sur une autre page contenu dans les ressources de mon bundle", comment est ce lien ?
    Je suppose que c'est une balise <a>, mais comment écris tu le contenu de l'attribut href ?
    Peux tu nous mettre un extrait ?
  • Paisible.frPaisible.fr Membre
    06:19 modifié #17
    Bonjour,

    J'ai trouvé un début de solution.
    Voici le code (attention : c'est assez sale) :

    <br />- (void) loadPage<br />{<br />	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br />	NSString *htmlFile = [NSString stringWithFormat:@&quot;%@/%@.htm&quot;, [paths objectAtIndex:0], @&quot;test&quot; ];<br />	NSData *htmlData = [NSData dataWithContentsOfFile:htmlFile];<br />	[self.pageWebContent loadData:htmlData MIMEType:@&quot;text/html&quot; textEncodingName:@&quot;UTF-8&quot; baseURL:[NSURL URLWithString:@&quot;&quot;]]; <br />}<br /><br />- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType<br />{<br />	[self loadPage];<br /><br />	return false;<br />}<br /><br />
    


    Il reste quelques problèmes :
    • 1) Ca charge tout le temps la page : "test.htm". Il faut juste que je passe en paramètre la page. Ca devrais pas être bien dur : je suis assez confiant
    • 2) Les images et les CSS ne sont pas chargés. Je pense qu'il faut que je parcours mon HTML dans htmlData pour ajouter le "file://" et le path complet pour que çà  fonctionne.
    • 3) je reste perplexe : cela me parait étrange qu'il n'y ai pas plus simple.
    • 4) est-ce que cela fonctionnera en dehors de l'émulateur ? grand mystère car j'ai pas fait le pas pour souscrire au developer program pour iPhone


    Merci à  tous ceux qui m'ont aidés. J'espère que ce poste aidera d'autre personnes par la suite.
Connectez-vous ou Inscrivez-vous pour répondre.