Télécharger un PDF en local sur l'iPhone

Ben77650Ben77650 Membre
avril 2015 modifié dans API UIKit #1

Bonjour,


 


J'aimerais télécharger un document PDF sur mon application en local sur l'iPhone et l'enregistrer dans eBook (afin si nécessaire de l'envoyer par mail).


 


J'ai fais ça:



NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    
    documentsDirectory = [documentsDirectory stringByAppendingPathComponent:@PDF_Documents];
    [[NSFileManager defaultManager] createDirectoryAtPath:documentsDirectory withIntermediateDirectories:YES attributes:nil error:nil];
    
    NSString *filePath = [NSString stringWithFormat:@%@/Facture%@", documentsDirectory, idFacture];
    
    [data writeToFile:filePath atomically:YES];

«1

Réponses

  • Eric P.Eric P. Membre
    mars 2015 modifié #2

    Bonjour,


     


    Je ne vois pas bien ce que fait ton code, mais une fois que tu as ton fichier pdf, tu peux le transférer dans une autre app qui sait le gérer, donc iBooks par exemple, avec un "UIDocumentInteractionController interactionControllerWithURL".


    Par contre de cette manière, l'utilisateur doit choisir l'app qui recevra le fichier.


    Je ne sais pas si le fichier peut être transféré obligatoirement et directement dans iBooks.


  • Bonjour Eric,

     

    A vrai dire c'est un code que j'ai repris de stackoverflow mais effectivement il ne marche pas.

     

    On peut pas faire en sorte que ça soit enregistré automatiquement avec iBooks ?

     

    Ce logiciel lit les PDF et est de base sur tous les devices de la marque Apple.

     

    Autrement comment ça se passe avec le UIDocumentInteractionController interactionControllerWithURL stp ?


  • Une fois que tu as ton fichier pdf, tu fais



    documentController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:file_to_Transfer]];
    documentController.delegate = self;
    [documentController retain];
    [documentController presentOpenInMenuFromBarButtonItem:inputButton animated:YES];

    où "file_to_transfert" est le chemin dudit fichier.


    Et cela te présente la liste des apps qui peuvent recevoir ton fichier en fonction de son type.


     


    Tu peux le voir avec mon app "iPocket Draw Lite" par exemple.

  • Hello Eric P.


     


    Je viens de tester ton bout de code, mais cela ne m'a absolument rien donner.


     


    J'aimerais qu'il y ai 2 options possibles sur mon PDF:


     


    1°) L'enregistrer sur iBooks


    2°) L'envoyer directement par mail.


     


    L'utilisateur décidera de l'option qu'il veut effectuer, selon 2 boutons bien distincts.


     


    Si toi (ou un autre membre de CocoaCafé) a une solution qui marche, ou si tu pouvais m'éclaircir sur le bout de code précédent (vu que visiblement il marche dans ton appli) ça serait pas de refuser :)


  • As-tu checké que ton URL est bien non-nil ?


  • Oui l'URL n'est pas nil, j'en suis certain vu qu'il m'affiche mon pdf dans ma web view ;)


  • Possibilités d'erreurs :


     


    1. Il faut que ton fichier PDF soit déjas téléchargé pour que tu puisses l'ouvrir avec : UIDocumentInteractionController


     


    2. N'oublie pas d'assigner le delegate et d'implémenter la méthode :



    - (UIViewController*)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller
    {
        return self;
    }

    3. Il faut aussi que tu gardes une référence forte sur ton objet : UIDocumentInteractionController  dans ton contrôleur. 



    @property (nonatomic, strong) UIDocumentInteractionController *documentController;

    4. Vérifie bien que ton document PDF est bien dans l'emplacement désigné par ton path.

  • Ben77650Ben77650 Membre
    avril 2015 modifié #9

    Bonjour,

     

    Je reviens à  nouveau vers vous concernant le souci d'enregistrement du PDF. (celui de l'envoi du PDF en PJ a été réglé). 

     

    J'arrive toujours pas à  détecter iBooks parmi les applications compatibles.


     


    Voila ce que je fait actuellement



    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [paths objectAtIndex:0];

    documentDirectory = [documentDirectory stringByAppendingPathComponent:@pdf];

    [[NSFileManager defaultManager] createDirectoryAtPath:documentDirectory withIntermediateDirectories:YES attributes:nil error:nil];

    NSString *filePath = [NSString stringWithFormat:@%@/%@", documentDirectory, idFacture];



    NSString *get =[[NSString alloc] initWithFormat:@http:;//aaaa.com/app/facture.php?idConnexion=%@&;mdpConnexion=%@&;idFacture=%@",idConnexion, mdpConnexion, idFacture];

    NSData *data=[NSData dataWithContentsOfFile:filePath];

    UIDocumentInteractionController* myDocumentController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:get]];
    myDocumentController.delegate = self;
    [myDocumentController presentOpenInMenuFromRect:CGRectZero inView:self.view animated:YES];

    [data writeToFile:filePath atomically:YES];

    Avec ça j'ai "Google Drive" et "USB Key" qui me sont proposés.


     


    Seulement que je clique sur l'un ou l'autre ça me plante l'application.


     


    J'ai lu quelque part d'utiliser les méthodes ci dessous. Est ce vraiment nécessaire ou est ce optionnel ?



    - (void)documentInteractionController:(UIDocumentInteractionController *)controller willBeginSendingToApplication:(NSString *)application
    {

    }

    - (void)documentInteractionController:(UIDocumentInteractionController *)controller didEndSendingToApplication:(NSString *)application
    {

    }

    - (void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller
    {


    Merci d'avance pour vos réponses


  • Si ça plante, y'a sûrement un message d'erreur non ? Lequel ?


    Si tu as mis self en tant que delegate (et un < UIDocumentControllerDelegate > où il faut), tu devrais avoir des warnings lorsque des méthodes delegates ne sont pas optional.


  • J'ai aucun warning que ça soit en mettant les 3 méthodes ou en ne les mettant pas. Doit-je en déduire qu'elles sont optionnelles ?

     

    Pour le message d'erreur ça me met ça:



    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSLayoutConstraint _openDocumentWithApplication:]: unrecognized selector sent to instance 0x1b862ba0'



     


    Sinon tu saurais pourquoi dans la liste des applications compatibles j'ai pas iBooks s'il te plait ?


  • AliGatorAliGator Membre, Modérateur
    Heu pour savoir si les 3 méthodes de delegate que tu cites sont nécessaires ou optionnelles, il suffit de regarder dans la doc du protocol si elles sont marquées obligatoires ou optionnelles, non ?

    Quant à  ton plantage, si tu ne nous dis pas le message d'erreur / crashlog que tu as, on va avoir du mal à  t'aider. Et je suis même sûr que si tu lis le message d'erreur que tu as dans ton plantage il te dit quel est le problème
  • AliGatorAliGator Membre, Modérateur
    Oulà  vu le message d'erreur ça sent la corruption mémoire...
  • Ben77650Ben77650 Membre
    avril 2015 modifié #14

    Comment régler ce problème de corruption mémoire s'il te plait ?


     


    Et comment faire en sorte d'avoir l'application "iBooks" parmi les applications pouvant télécharger mon PDF


  • Mets ton documentController en strong ?


    As-tu iBooks d'installé sur le device sur lequel tu testes?


  • AliGatorAliGator Membre, Modérateur
    avril 2015 modifié #16

    Bon visiblement les méthodes ne sont plus dans la documentation donc obsolètes.

    Comment ça "les méthodes ne sont plus dans la documentation" ?!

    Doc Apple

    Je sais pas comment tu te débrouilles pour chercher dans la doc, mais c'est pourtant pas bien dur à  trouver et tout y est écrit (cf au début dudit lien dans la doc) :

    If you use a document interaction controller to display a document preview, your delegate must implement the documentInteractionControllerViewControllerForPreview: method. All other methods of this protocol are optional.

  • @Larme  Tu crois que ça va changer quelque chose de le mettre en strong ?


    Oui iBooks est installé sur mon iPhone, et je crois avoir lu qu'il l'était de base de toute manière sur tous les téléphones / tablettes Apple


     


    @Ali: Oui j'ai vu ça après, c'est juste que j'étais pas sur la bonne page de la documentation




  • @Larme  Tu crois que ça va changer quelque chose de le mettre en strong ?




    http://stackoverflow.com/questions/26343420/open-local-pdf-file-in-ibooks


     


    Sinon, d'après l'erreur, il semblerait que tu perdes la trace du document controller (notamment quand le delegate lui demande d'ouvrir le fichier avec une autre app). D'où la piste potentielle apparemment appuyée par le lien de SO.

    J'ai pas cherché d'avantage, donc pas de regard en profondeur, mais ça semblerait être une explication potentielle.

  • AliGatorAliGator Membre, Modérateur
    avril 2015 modifié #19
    UIDocumentInteractionController étant asynchrone, il faut sans doute garder une référence forte en @property(strong) pour pas que ta référence disparaisse alors que tu n'es pas arrivé au bout du workflow.


  • @Larme  Tu crois que ça va changer quelque chose de le mettre en strong ?




     


    Pourquoi tu reposes la question à  @Lame alors qu'il suffit juste que tu le changes et de voir ce que ça donne :)

  • Je trouve bizarre le :


    [NSURL fileURLWithPath:get]


     


    Es-tu sûr que get pointe sur un fichier pdf ?


     


    J'ai à  peu près le même code et iBooks m'est proposé.


  • Pour ton crash, mon code n'étant pas en Arc, j'ai un retain sur mon UIDocumentInteractionController qui est déclaré en global de mon .m



  • @Ali: Oui j'ai vu ça après, c'est juste que j'étais pas sur la bonne page de la documentation




     


    Ouais moi aussi je ne lis qu'une page (au hasard de préférence) de chaque documentation.


    Je ne comprends pas tout ce que je lis  ;D

  • AliGatorAliGator Membre, Modérateur

    qui est déclaré en global de mon .m

    o_O toi tu veux me faire faire une crise cardiaque :-/


  • o_O toi tu veux me faire faire une crise cardiaque :-/




    Ha, je pensais bien avoir une réaction mais pas jusqu'à  la crise cardiaque !


     


    Oui j'avoue, j'utilise des globales et je n'ai toujours pas compris pourquoi il ne faudrait pas le faire, désolé.

  • Joanna CarterJoanna Carter Membre, Modérateur

    Discussion intéressante : http://c2.com/cgi/wiki?GlobalVariablesAreBad



  • Je trouve bizarre le :
    [NSURL fileURLWithPath:get]

     

    Es-tu sûr que get pointe sur un fichier pdf ?

     

    J'ai à  peu près le même code et iBooks m'est proposé.



     

    Oui, c'est un pdf avec un "Content-type: application/pdf"

     



    Ouais moi aussi je ne lis qu'une page (au hasard de préférence) de chaque documentation.

    Je ne comprends pas tout ce que je lis  ;D




    J'était sur la page de UIDocumentInteractionController et non celle de UIDocumentInteractionControllerDelegate


  • Effectivement avec le UIDocumentInteractionController en strong ça marche très bien.


     


    Par contre j'ai toujours pas l'application iBooks de disponible dans les applications pouvant ouvrir mon document.


     


    Une idée d'où ça peut venir s'il vous plait ?


  • Apparemment, y'a une différence entre :
    presentOpenInMenuFromRect:inView:animated: et presentOptionsMenuFromRect:inView:animated:.


     


    J'ai pas tout lu, mais j'ai cru voir sur SO que dans un cas où un autre cela pouvait montrer ou non iBooks, et la Doc signale une différence. En diagonale, j'ai cru comprendre que l'un disait : " Plus ou moins n'importe qui est intéressé par mon fichier ? ", tandis que l'autre dit : " Qui est intéressé par un fichier .pdf ? ". Ce qui est différent.


    Peut-être qu'il faudrait remplir correctement un certain champ.


  • Ok je vais regarder de ce côté la alors, merci


     


    Ca n'empêche que si quelqu'un a la solution je la veut bien :)


  • J'ai effectivement plus d'options ("Message" et "Envoyer par e-mail" sont apparus) mais toujours pas de iBooks


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