Comment transformer un XIB en NIB ?

Connaissez-vous un moyen de transformer un fichier XIB en NIB ?

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur
    22:50 modifié #2
    ibtool --errors --warnings --notices --output-format human-readable-text --compile your.xib output.nib

    Non ?
  • Paisible.frPaisible.fr Membre
    22:50 modifié #3
    dans 1222433088:

    ibtool --errors --warnings --notices --output-format human-readable-text --compile your.xib output.nib

    Non ?

    Heu, je sais pas ! J'essayerais ce soir ...

    Je savais que c'étais possible de NIB vers XIB car je l'avais lu je ne sais oຠplusieurs fois, mais je me posais la question dans l'autre sens.

    Je voudrais le faire car j'ai commit l'erreur de faire mon IHM en XIB, du coup pour localiser ça le fait moins  ???

    Merci en tout cas.
  • Philippe49Philippe49 Membre
    septembre 2008 modifié #4
    dans 1222435191:

    Je voudrais le faire car j'ai commit l'erreur de faire mon IHM en XIB, du coup pour localiser ça le fait moins  ???


    ?
  • CéroceCéroce Membre, Modérateur
    22:50 modifié #5
    D'après ce que j'ai compris, les XIB ne se trouvent pas dans l'appli (ils ont été compilés), mais rien ne t'empêche de fournir le XIB non compilé à  tes traducteurs.
  • Paisible.frPaisible.fr Membre
    22:50 modifié #6
    Je me réponds à  moi-même : pour transformer un XIB en NIB il suffit dans InterfaceBuilder de faire "Save as ..." et de choisir le format adapté.

    Voila, je me paye un coup à  boire moi-même  :p mais aussi à  vous tous pour vos infos complèmentaires  :p
  • Philippe49Philippe49 Membre
    22:50 modifié #7
    J'avoue ne pas avoir compris ce qui a été dit dans ce post.

    • Pour moi xib ou nib c'était simplement une question de format d'écriture du fichier, XML pour xib et l'ancienne version pour nib, mais n'ayant pas le temps de vérifier je ne voudrais rien affirmer ...

    • Pour localiser un .xib, je fais Make Localisable dans les infos, et ça passe ...

    • Quand au fait que les xib ne se trouve pas dans l'appli, cela me semble faux à  l'expérience : si on ouvre le répertoire contents , on trouve ce fichier.
  • psychoh13psychoh13 Mothership Developer Membre
    22:50 modifié #8
    Les XIB sont bien en XML alors que les NIB sont des bundles contenant des fichiers binaires.

    Le XIB remplace le NIB uniquement dans le projet Xcode. Lors de la compilation du projet, les XIB sont transformés en NIB et copiés dans le bundle de l'application finale. Il n'y a donc aucun NIB dans un project Xcode, et aucun XIB dans un .app.

    Pourquoi avoir changé de format pour les projets Xcode ?
    Tout simplement parce que les NIB ne fonctionnent pas bien avec les logiciels de versions comme SVN du fait que ce soient des dossiers contenant du binaire. Il n'est pas possible avec les NIB de faire un delta ce qui est pourtant très utile pour les logiciels de versioning.
    Donc pour parer à  ce problème, Apple a créé les XIB au format XML qui contiennent les mêmes informations que les NIB mais qui permettent de voir les modifications apportées au fichier par un utilisateur.
  • fouffouf Membre
    22:50 modifié #9
    Hmm, pas completement convaincu par cette différence : il m'est déjà  arrivé d'éditer un ficher NIB pour supprimer des références à  des classes qui n'existaient plus dans mon code. Donc, si mes souvenirs sont bons, une partie au moins des fichier NIB sont en format texte (les fichiers .classes du wrapper si je me souviens bien). Je pense que la différence est bien plus grande que le "simple" changement binaire -> XML.
  • psychoh13psychoh13 Mothership Developer Membre
    22:50 modifié #10
    Pour commencer, il y avait dans les NIB du texte, maintenant qu'ils sont compilés ils ont été mis dans une forme beaucoup plus compacte et surtout illisible avec IB...
    Le changement essentiel c'est que dans le cas du NIB tu as un bundle, c'est-à -dire que le .nib est un dossier contenant d'autres fichiers ce qui n'est pas génial pour le versioning, et dans le cas du XIB c'est un unique fichier texte au format XML, ce qui est plus pratique pour le versioning.
  • AliGatorAliGator Membre, Modérateur
    avril 2009 modifié #11
    Hello les gens,

    Je déterre ce sujet car je cherche, si c'est possible par un quelconque moyen, à  décoder/décompiler un NIB compilé (NIB d'un projet iPhone). C'est à  dire qu'à  partir de la version compilée en NIB je voudrais obtenir un fichier XIB, ou au moins retrouver l'architecture de l'interface...

    J'ai bien essayé avec ibtool mais bien sûr il me refuse de lire un fichier compilé, tout comme InterfaceBuilder qui me dit qu'il faut que j'ouvre le XIB à  la place...

    J'ai cherché vite fait sur le net mais les pages sur lesquelles je tombe pour "lire un fichier NIB" c'est de l'ouvrir avec InterfaceBuilder... car ils parlent de l'ancien format NIB (format bundle que IB manipulait avant que IB3 n'apparaisse et utilise les XIB en XML à  la place, moment à  partir duquel l'extension .nib a du coup été utilisée pour la version compilée de ces XIB et non plus comme fichiers sources directement lisibles par IB...) du coup ça ne m'est pas d'une grande aide...

    A défaut qu'il existe un convertisseur NIB->XIB ou même juste un extracteur d'infos du NIB, j'avais pensé créer un outil du genre moi-même, en utilisant NSCoder et le mécanisme de loading des NIBs, quitte à  faire des catégories pour surcharger des trucs pour que s'il ne trouve pas certaines classes il m'informe au moins de leur existance et des propriétés qu'il essaye de connecter au lieu de planter sur le chargement... Mais bon je ne sais pas trop comment m'y prendre... des idées ?
  • schlumschlum Membre
    22:50 modifié #12
    Je ne pense pas que ça soit faisable... Je suppose que pour compiler un .xib, il remplace l'archive par du code de construction qu'il compile pour faire une sorte de .o... Du coup, il faudrait déjà  décompiler la partie de construction, puis reconstruire un .xib avec. ça me paraà®t tendu  B)
  • AliGatorAliGator Membre, Modérateur
    22:50 modifié #13
    Ah ouais j'avais pas pensé qu'il pouvait en effet compiler le xib en un fichier objet contenant directement le code de création de l'interface... ceci dit si je passe un coup de "otool" sur le fichier nib, il me répond "....nib is not an object file" alors bon...? A moins que ce soit une sorte de fichier objet mais au format un peu propriétaire ?

    Moi j'avais plutôt pensé que ça serait une version binaire du XIB, désarchivée avec un NSCoder... donc que le fichier NIB pourrait ainsi être chargé au même titre qu'une autre archive binaire créée par NSCoder, non ?

    Mais comme je ne maà®trise pas encore trop la partie sérialisation/archivage derrière NSCoder (à  vrai dire je vois grosso modo le principe mais je ne l'ai jamais mis en pratique, jamais eu à  implémenter le protocole NSCoding encore) je ne sais pas dans quelle mesure utiliser cette supposition pour demander à  une appli que je coderais moi-même de décoder le NIB et de m'afficher des infos dessus...

    Le but n'est pas forcément de convertir le NIB en XIB (même si ça serait l'idéal mais je doute de la faisabilité), mais au moins d'avoir des infos, genre avoir en sortie l'arborescence des objets archivés dans le nib, par exemple la view hierarchy, et qques propriétés des vues instanciées dans ce NIB...
  • schlumschlum Membre
    22:50 modifié #14
    Dans un truc encodé avec NSCoding, il y a les noms des keys en clair (au moins)... Est-ce que tu as des trucs lisibles dans le binaire ?
  • psychoh13psychoh13 Mothership Developer Membre
    22:50 modifié #15
    Je doute que ce soit du code compilé, mais je doute aussi fortement que ce soit encodé à  l'aide de NSCoder, en tout cas, décoder avec NSUnarchiver ou NSKeyedUnarchiver ne donne rien.

    C'est sûrement un format spécial... Et il va falloir t'amuser à  faire du reverse engineering là -dessus. :D
  • AliGatorAliGator Membre, Modérateur
    22:50 modifié #16
    dans 1239895659:

    Dans un truc encodé avec NSCoding, il y a les noms des keys en clair (au moins)... Est-ce que tu as des trucs lisibles dans le binaire ?
    Si c'est un KeyedArchiver, oui, mais sinon...


    ...

    [voix d'Homer Simpson]Ouh pinaise ![/voix d'Homer Simpson] j'avais même pas essayé d'ouvrir le fichier .nib avec un éditeur de texte, persuadé que ça serait un format binaire illisible... Mais en fait c'est du XML format PLIST :o

    &lt;plist version=&quot;1.0&quot;&gt;<br />&lt;dict&gt;<br />&lt;key&gt;$archiver&lt;/key&gt;<br />&lt;string&gt;NSKeyedArchiver&lt;/string&gt;<br />&lt;key&gt;$objects&lt;/key&gt;<br />&lt;array&gt;....&lt;/array&gt;<br />&lt;/dict&gt;
    
    Bon j'ai plus qu'à  étudier le contenu... bon après dedans y'a des classes perso utilisées et ça je vais pas pouvoir toutes deviner ce qu'elles font, mais déjà  je suis étonné de voir du PLIST format XML en ouvrant le NIB... d'autant plus que c'est pour iPhone, donc en général tout est compressé (même les PNG sont modifiés avant d'être installés sur iPhone, c'est pas des vrais PNGs copiés sur le device) donc à  la limite j'aurais plutôt vu un plist au format binaire  ???

    Enfin bon tant mieux ça m'arrange ^^
  • schlumschlum Membre
    22:50 modifié #17
    En fait, ce n'est absolument pas compilé... Il suffit de rajouter un "classes.nib", un "info.nib" et un "objects.nib" bidons d'un autre .nib et on peut les ouvrir dans IB.
  • AliGatorAliGator Membre, Modérateur
    avril 2009 modifié #18
    dans 1239897246:

    En fait, ce n'est absolument pas compilé... Il suffit de rajouter un "classes.nib", un "info.nib" et un "objects.nib" bidons d'un autre .nib et on peut les ouvrir dans IB.
    ??? ??? Heu je vois pas d'où tu les trouves tes "classes.nib", "info.nib" et "objects.nib" en fait ?
    Moi si je fouille dans mes projets, j'ai soit mes fichiers .XIB qui ne sont que des XMLs (de racine [tt]<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.02">[/tt] ...) soit j'ai les NIB compilés, qui s'avèrent donc en fait ne pas être compilés mais des NSKeyedArchives format plist XML...

    Du coup je vois pas de quels nibs tu parles donc en citant ces 3 là ... ?

    [EDIT]J'imagine que tu fais en fait référence à  la récupération d'un NIB à  l'ancien format, qui il me semble était en fait un bundle... J'ai en effet retrouvé un de tes vieux posts sur macbi qui causait de ça... mais moi j'ai pas de vieux NIBs à  l'ancien format ^^ je vais voir si je peux pas en recréer avec IB pour le leurrer avec cette astuce...
  • schlumschlum Membre
    22:50 modifié #19
    Bah je les ai récupérés d'une vieille appli à  moi  :P
  • AliGatorAliGator Membre, Modérateur
    22:50 modifié #20
    Bon on peut pas créer d'archive IB à  l'ancien format avec IB3 (je m'en doutais un peu) mais j'ai récupéré un NIB-bundle d'un ancien projet et essayé de remplacer le keyedobjects.nib par le NIB que je veux ouvrir (en le renommant)... bah il veut pas, quand je l'ouvre avec IB il me met une erreur.

    Sans doute parce que le NIB que je met à  la place du keyedobjects.nib est un fichier d'interface iPhone, avec les classes du UIKit, alors que mon NIB-bundle dans lequel je le met définit qqpart dans classes.nib et info.nib que c'est un projet Cocoa et pas CocoaTouch, donc pas avec les mêmes plugins et outils dans IB...
  • schlumschlum Membre
    22:50 modifié #21
    Pourquoi en le renommant ? ça ne s'appelait pas déjà  "keyedobjects.nib" ??

    J'ai fait l'essai avec les preférences de Safari, ça s'est ouvert... Normalement, iPhone ou non, y a pas de raison...
  • AliGatorAliGator Membre, Modérateur
    22:50 modifié #22
    Quand je dis "en le renommant" c'est en renommant le fichier NIB venant du bundle de mon appli iPhone, qui s'appellait un truc genre MyMovieController.nib quoi, en "keyedobjects.nib" pour le mettre dans le bundle NIB ancien format ensuite.
    Dans le bundle NIB récupéré d'une ancienne appli, y'avait déjà  bien "classes.nib", "info.nib" et... "keyedobjects.nib", mais le fichier NIB (nouveau format généré par la compilation du xib IB3) que je veux décrypter dans IB, lui, ne s'appellais pas "keyedobjects.nib" ;)

    Sinon du coup bah chez moi ton astuce marche... pour quand je récupère un fichier .nib résultant d'un build d'un projet Mac fait avec IB3 (et donc résultant d'un XIB pour appli MacOS), pour le mettre dans un bundle NIB récupéré d'un projet IB2.
    Mais si je récupère un fichier .nib dans le bundle d'une appli iPhone (la mienne ou une autre) -- et non pas d'un projet Mac -- et que je fais la même manip, bah ça marche plus...

    Faudrait pouvoir ajuster les fichiers classes.nib et info.nib pour refléter le fait que c'est prévu pour un projet iPhone... si c'est réalisable.

    Par contre je reste étonné que les "nib" créés suite au build d'un projet IB3 (à  partir de xib donc) ne soient que des plist xml... moi qui pensait que le changement de format des nib était dû au fait qu'ils étaient mal gérés par les logiciels de versionning genre SVN (alors qu'un NIB ancien format à  la IB2 c'est qu'un bundle, vu comme un simple dossier par la plupart des outils genre svn j'imagine, dont le contenu n'était que des xml à  son tour... donc où est l'avantage d'avoir changé de format du coup ?)
  • schlumschlum Membre
    22:50 modifié #23
    Il n'y a que le "objects.nib" qui est binaire chez moi dans mes vieilles applis...
    À mon avis, l'intérêt c'était surtout d'avoir un seul fichier XML pour faciliter les localisations etc...
Connectez-vous ou Inscrivez-vous pour répondre.