[Résolu] iOS8 trouver un fichier dans l'App

octobre 2014 modifié dans API UIKit #1

Bonjour à  tous,


 


Voilà , j'ai cette ligne de code qui fonctionne très bien sous iOS 7 :



NSString *errorPath = [NSString stringWithFormat:@%@/www/error.html", resourcePath];
self.errorRequest = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:errorPath]];

Mais qui ne fonctionne plus du tout sous iOS 8. On utilise Cordova et le fichier est dans notre projetCordova/dossier1/dossier2. Ce ne sont pas les dossiers standard comme "documents".


 


De plus je précise que nous travaillons dans un Workspace, donc le fichier ce trouve dans projetCordova mais notre code qui appel ce fichier est dans notreProjet. Voilà , histoire de vous embrouiller un peu :)


 


Est-ce que vous avez une idée  ? J'ai essayé des trucs comme URLForRessource mais pour le moment ça ne donne rien.


Réponses

  • AliGatorAliGator Membre, Modérateur
    Ah cette belle m*$%@de de Cordova... qui fait tout à  sa sauce dans une boite tellement obscure et crado que quand ça marche pas t'as plus qu'à  allumer un cierge et faire la danse de la pluie en sacrifiant un poulet...
  • Merci pour ton soutien et ton aide :)


     


    (sinon oui je partage ton avis sur Cordova, j'aime pas ça mais j'ai pas choisi)


  • Que veux-tu faire avec ton code? Je ne comprends pas où tu veux en venir.


  • Trouver un fichier, tout simplement. Si je fais :



    if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithFormat:@error.html]])
    {
    NSLog(@EXIST);
    }
    else
    {
    NSLog(@DON'T EXIST);
    }

    La console affiche bien EXIST. Par contre, quand je veux accéder à  ce fichier pour l'ouvrir dans une UIWebView, là  j'ai une erreur et le fichier n'est pas affiché. Sous iOS 7 ça fonctionne très bien, dès que je passe avec iOS 8, plus rien.


     


    Apparemment il y a un bug connu avec WKWebView mais bon, je doute qu'il existe une relation entre UI/UKWebView sur ce sujet.


     


    Quand j'affiche le path de mon fichier, sous iOS 8 il commence par private/ ce qui n'est pas le cas sous iOS 7.


     


    Est-ce plus clair ?


  • AliGatorAliGator Membre, Modérateur
    octobre 2014 modifié #6
    C'est bizarre que le premier marché sous iOS7. Ca devrait pas. Tu lui donnes un chemin local/relatif, mais relatif à  quoi ?! Tu n'utilises même pas les methodes de NSBundle pour trouver le path du fichier dans ton bundle ou les methodes pour récupérer le chemin de ta Sandox et construire le path à  partir de là  (cf le File System Programming Guide tout ça)


    Quant à  la WebView, même question, quelle est sa baseURL à  partir de laquelle il construit les chemins absolus ?


    Juste donner le nom du fichier comme ca ne peut pas marcher si tu ne sais pas a quel dossier le chemin est relatif.


    (au passage, quel intérêt d'appeler stringWithFormat pour lui passer une chaà®ne constante sans format ?!)
  • octobre 2014 modifié #7

    Concernant ta remarque sur le stringWithFormat, c'est juste que j'ai fais plusieurs tests et que je changeais la construction de la string mais dans ce cas, effectivement c'est inutile.


     


    Après vérification (j'ai ouvert le paquet de l'App en fait), le fichier que je recherche ce trouve dans www/.


     


    Donc si je fais ceci :



    NSURL *errorPath = [[NSBundle mainBundle] URLForResource:@www/error withExtension:@html];

    Est-ce que c'est bon ? Je suis en train de lire la doc sur le File System et ça fonctionne maintenant correctement sur iOS 7 et 8.


     


    Par contre, dans la foulé si je fais :



    if ([[NSFileManager defaultManager] fileExistsAtPath:[[self.errorRequest URL] absoluteString]]) {
    NSLog(@OUI);
    }
    else
    {
    NSLog(@NON);
    }

    NON est affiché.


  • AliGatorAliGator Membre, Modérateur
    octobre 2014 modifié #8
    Bah heu oui c'est normal. Tu demandes si un fichier existe sur le disque, en lui passant comme chemin (path)... une URL commençant par "http" !

    Hey, what did you expect?
  • Mon errorRequest est bien un fichier qui est présent sur le device et après l'avoir affiché dans la console, ça ne commence pas par http mais file:///


     


    Ou alors j'ai pas compris ta réponse.


  • AliGatorAliGator Membre, Modérateur
    Un file:/// n'est il me semble pas une URL toujours reconnue selon les critères du Sandboxing appliqués à  ton application. En général il me semble que l'URLScheme "file:" n'est pas manipulable avec NSFileManager sur iOS pour éviter les fuites que ça pourrait donner côté sandboxing.
  • HerveHerve Membre
    octobre 2014 modifié #11

    Chez moi, cette méthode marche très bien :



    NSString *path = [[NSBundle mainBundle] pathForResource:@UserGuide ofType:@pdf];
    NSURL *url = [NSURL fileURLWithPath:path];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];

    Utilisée pour afficher une notice au format pdf dans un WebView.


     


    Pourquoi veux-tu charger des erreurs???


  • AliGatorAliGator Membre, Modérateur
    Pour une NSURLRequest oui ça marche, mais pour d'autres cas y'a des exceptions. Pour un canOpenURL: par exemple, s'il détecte que l'URL a comme scheme "file://" alors il dit NO, sans même vérifier si ça pointerait pas dans ta Sandbox.

    Mais je suis d'accord, pourquoi vouloir charger les erreurs, sous la forme d'URL qui plus est, la demande me semble assez étonnante.
  • C'est très simple, l'App est entièrement basé sur une UIWebView, si une erreur est déclenché (typiquement, pas de connection, WiFi coupé par exemple) et bien dans ce cas on affiche la page html aux couleurs du client. C'est tout.


     


    Merci pour ces précisions ali.


  • AliGatorAliGator Membre, Modérateur
    Bah t'as une baseURL sur ta UIWebView, elle est là  pour ça, pour que toutes tes URLs relatives soient relatives au bon chemin, pourquoi tu ne rediriges pas vers ces pages par URL relative si tu as bien correctement spécifié la baseURL ?
  • J'ai jamais compris l'usage du baseURL, tu veux dire que si je fais un truc du genre setBaseURL et que je lui donne mon error.html, il chargera par défaut cette adresse ?


  • AliGatorAliGator Membre, Modérateur
    Hein ?! Mais non.


    La baseURL c'est... bah la baseURL quoi, celle à  partir de laquelle il détermine les URL complètes pour les URLs relatives... enfin c'est expliqué dans landic, et puis cest un concept commun au Web/HTTP et cest pas propre au WebKit ou aux WebViews, c'est la baseURL pour tes URL relatives quoi...
  • octobre 2014 modifié #17

    ...


Connectez-vous ou Inscrivez-vous pour répondre.