Comment transformer un XIB en NIB ?
Paisible.fr
Membre
Connaissez-vous un moyen de transformer un fichier XIB en NIB ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
?
Voila, je me paye un coup à boire moi-même mais aussi à vous tous pour vos infos complèmentaires
• 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.
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.
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.
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 ?
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...
C'est sûrement un format spécial... Et il va falloir t'amuser à faire du reverse engineering là -dessus.
...
[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
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 ^^
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...
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...
J'ai fait l'essai avec les preférences de Safari, ça s'est ouvert... Normalement, iPhone ou non, y a pas de raison...
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 ?)
À mon avis, l'intérêt c'était surtout d'avoir un seul fichier XML pour faciliter les localisations etc...