Elaboration d'une librairie/framework

KixxxKixxx Membre
Bonjour,

Quelle est la meilleure façon de créer des librairies réutilisables en Objective-C ?
Connaissez-vous des bon tutoriels sur ce sujet ?

Par avance, merci.

Cordialement,
Kevin.

Réponses

  • AliGatorAliGator Membre, Modérateur
    21:32 modifié #2
    La dernière fois que j'avais eu à  faire ça j'avais suivi ce tuto : http://db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/

    J'ai aussi trouvé ça à  l'isntant avec Google mais jamais testé encore : https://github.com/kstenerud/iOS-Universal-Framework
  • KixxxKixxx Membre
    21:32 modifié #3
    Merci pour ces liens ;) !

    Sinon, j'ai une autre question :
    - Comment pourrais-je savoir quel est le meilleur type de Framework à  utiliser dans mon cas ? Statique ou Dynamique ?
    D'après les explications de ton premier lien, j'opterai plus pour une librairie dynamique.
    J'aurais alors seulement les fichiers .h ? et les méthodes ne pourront pas être modifiées ?


    Cordialement,
    Kévin.
  • CéroceCéroce Membre, Modérateur
    21:32 modifié #4
    Sous iOS, tu n'as pas le choix, c'est forcément une bibliothèque statique ou framework statique, autrement ton appli sera refusée par Apple.

    Une framework est essentiellement utile lorsqu'on veut associer des ressources (fichiers .plist, images, etc.) au code; une simple bibliothèque statique est plus facile à  créer, le modèle est déjà  prêt dans Xcode.
  • KixxxKixxx Membre
    21:32 modifié #5
    dans 1326796200:

    Sous iOS, tu n'as pas le choix, c'est forcément une bibliothèque statique ou framework statique, autrement ton appli sera refusée par Apple.

    Une framework est essentiellement utile lorsqu'on veut associer des ressources (fichiers .plist, images, etc.) au code; une simple bibliothèque statique est plus facile à  créer, le modèle est déjà  prêt dans Xcode.


    Ok, merci pour ta réponse ! As-tu par hasard un lien expliquant par étape l'élaboration de cette fameuse bibliothèque statique et comment l'intégrer ensuite dans un projet quelconque ?


    Cordialement,
    Kévin.
  • CéroceCéroce Membre, Modérateur
    21:32 modifié #6
    Non, je n'ai rien de tel, mais ce n'est pas très compliqué:

    Créer une bibliothèque statique

    Xcode > File > New > Project > iOS > Framework & Library.

    Tu n'as plus qu'à  y placer des .h et .m.


    Inclure une bibliothèque statique

    Il suffit de glisser la bibliothèque (fichier .a) dans le projet cible, elle est automatiquement ajoutée au dépendances du projet. N'oublie pas d'ajouter les .h de la bibliothèque pour que le linker connaisse les fonctions et méthodes.
  • KixxxKixxx Membre
    21:32 modifié #7
    OK je vais approfondir ceci !
    Un grand merci à  vous deux. Vous êtes très réactifs ;)

    Cordialement,
    Kévin.
  • AliGatorAliGator Membre, Modérateur
    21:32 modifié #8
    dans 1326805791:

    Non, je n'ai rien de tel, mais ce n'est pas très compliqué:

    Créer une bibliothèque statique

    Xcode > File > New > Project > iOS > Framework & Library.

    Tu n'as plus qu'à  y placer des .h et .m.


    Inclure une bibliothèque statique

    Il suffit de glisser la bibliothèque (fichier .a) dans le projet cible, elle est automatiquement ajoutée au dépendances du projet. N'oublie pas d'ajouter les .h de la bibliothèque pour que le linker connaisse les fonctions et méthodes.
    Oui c'est en général aussi simple que ça... avec tout de même une petite subtilité quand on travaille pour iOS et donc à  la fois un peu avec le simulateur et en testant sur Device :
    - Le Simulateur tourne sur OSX et comme son nom l'indique n'est qu'un simulateur et pas un émulateur, du coup quand on compile pour le simu on compile en i386 (architecture Intel)
    - Alors que sur Device, l'architecture est du ARM (armv7, ou armv6 pour les modèles un peu moins récents)

    Du coup si tu crées une librairie (ce qui est en effet aussi simple que tu le décris Céroce), il faut faire gaffe à  créer une lib statique compilée pour Intel (i386) pour quand tu testes sur le simu, et une lib compilée pour ARM (armv6, armv7) pour compiler ton appli pour Device. Et ensuite, soit utiliser l'une ou l'autre selon si tu compiles ensuite et teste ton appli qui utilise cette lib pour Simu ou Device, soit faire une librairie "Universelle" en regroupant les deux libs dans un "Universal Binary" aussi appelé "FAT Library", à  l'aide de l'outil en ligne de commande lipo, pour fusionner les 2 architectures dans un seul fichier et utiliser ainsi une seule lib dans ton appli ensuite.

    C'est justement ce petit détail qui rend la chose un peu "tricky" pour iOS. Car sans ça sinon c'est tout ce qu'il y a de plus simple et rien de sorcier comme l'a dit Céroce. Et c'est à  ça que servent les scripts que tu peux voir trainer dans les tutos en général expliquant comment créer un "Static Framework" pour iOS : ces scripts s'assurent que ta lib sera compilée en Intel ET en ARM puis fusionnent les 2 architectures dans un seul fichier final.
  • CéroceCéroce Membre, Modérateur
    21:32 modifié #9
    Le template Xcode ne gère-t-il déjà  pas cet aspect ?
    Pour l'import, il me semble que Xcode n'est pas trop bête et prend la version de la bibliothèque qui convient selon la cible et l'architecture.
  • KixxxKixxx Membre
    21:32 modifié #10
    Bonjour,

    Je reviens vers vous parce que j'ai un petit problème pour l'intégration d'une librairie !
    En effet, j'ai donc créer une simple StaticLibrary. Ma librairie n'a rien de fonctionnelle, elle permet seulement d'afficher un message bref...
    J'ai également ajouter les points .h de mes deux classes dans la partie CompileSource dans Builds Phases !

    Ensuite, j'ai glissé le fichier .a dans un autre projet !
    La dépendance est bien présente !

    Mais quand j'essaye d'importer un fichier .h de ma librairie dans une classe de mon autre projet, il ne trouve pas de référence.  ???

    Ai-je oublié une étape ?

  • AliGatorAliGator Membre, Modérateur
    21:32 modifié #11
    Au choix, soit tu copies le .h à  côté de ton projet pour qu'il la trouve, soit dans les réglages de ton projet qui importe la lib tu précises aussi le chemin vers ce .h dans le "Header Search Path" pour qu'il sache où aller le chercher et puisse le trouver !
  • KixxxKixxx Membre
    21:32 modifié #12
    dans 1326895803:

    Au choix, soit tu copies le .h à  côté de ton projet pour qu'il la trouve


    C'est-à -dire à  côté ? Désolé je n'ai pas très bien compris  :o

    dans 1326895803:

    soit dans les réglages de ton projet qui importe la lib tu précises aussi le chemin vers ce .h dans le "Header Search Path" pour qu'il sache où aller le chercher et puisse le trouver !


    Comment puis-je connaà®tre le bon chemin vers ce .h ?

    Mais à  quoi sert l'intégration de librairies statiques, si nous sommes obliger de configurer les liens vers leur header !? Je ne vois pas trop l'utilité .. autant créer "des classes" réutilisable simplement en les copiant-collant :/
  • AliGatorAliGator Membre, Modérateur
    21:32 modifié #13
    Bah heu c'est le même principe pour les classes.
    Que ton code soit compilé dans une lib statique ou pas, ça change rien au fait qu'il faut bien qu'il sache où trouver le .h ! Ca change pas d'avant !
    Sauf que là  ta lib tu l'as créée dans un projet séparé donc le projet qui utilise ta lib il sait pas où trouver le .h qui vient de l'autre projet !

    C'est un réglage assez classique, présent dans tous les IDE (pas propre à  Xcode) et un flag qui existe pour tous les compilateurs. C'est juste que le répertoire du projet est inclus par défaut dans les dossiers cherchés pour importer les .h donc forcément si ton .h est déjà  dans le projet y'a rien de plus à  faire, ce qui est le cas dans 98% des cas quand tu ne travailles qu'avec un seul et unique projet et tout dedans.


    Si tu veux pas te soucier de ces problématiques, tu encapsules la lib et tout ce qui est nécessaire pour qu'elle fonctionne, en particulier ses .h justement, dans un framework. C'est fait pour ça, c'est juste un bundle avec donc (comme tout bundle) une structure/arborescence bien définie qui fait que tous les frameworks sont organisés pareil et si tu importes le framework Xcode sait alors où trouver tout ce qu'il lui faut.
    Ca facilite les choses. Mais ça par contre c'est propre à  Xcode : dans les autres IDE genre VisualStudio ou Eclipse, ce concept de framework n'existe pas et tu es obligé soit de copier le .h à  côté de la lib ou, ce qu'on préfère faire en général, modifier le Header Search Path. Bref, ce que je t'ai conseillé de faire vu que tu n'es pas parti pour faire un framework mais juste une lib (ce qui serait déjà  bien pour commencer)



    Pour plus d'infos, Comme d'hab tout est dans la doc Apple.
  • KixxxKixxx Membre
    21:32 modifié #14
    Merci AliGator pour toutes tes explications ;) !

    Je viens de m'apercevoir que pour utiliser la librairie Google Analytics (que j'ai déjà  utilisé) il faut aussi importer un .h !
    Ok je vais m'informer sur les autres façon d'intégrer une librairie.



  • 'AliGator' a écrit:
    La dernière fois que j'avais eu à  faire ça j'avais suivi ce tuto : http://db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/ J'ai aussi trouvé ça à  l'isntant avec Google mais jamais testé encore : https://github.com/kstenerud/iOS-Universal-Framework




    Quand le projet devient important il est préférable de faire comme indiqué un pseudo framework pour des parties bien au point, ce framework évite les soucis de savoir ou sont les .h, évite surtout la duplication de code au fil des années car de toute façon on va re-utiliser le code, il faut donc l'organiser.
Connectez-vous ou Inscrivez-vous pour répondre.