Déterminer version application

mac_manumac_manu Membre
01:42 modifié dans API AppKit #1
Hello,
Une question toute bête. J'ai fais une modification de mon code et, pour lire les anciens fichiers enregistrés, il me faudrait connaà®tre la version de mon application avant l'instruction:

- (id)initWithCoder:(NSCoder *)coder

pour, selon le résultat, faire tel ou tel action. Qui peut me renseigner ?

Merci...

Réponses

  • AntilogAntilog Membre
    01:42 modifié #2
    Est-ce que ceci te conviendrais?

    [tt]NString * version;
    version = [[[NSBundle mainBundle] infoDictionary] objectForKey:CFBundleVersion];[/tt]

    ou

    [tt]NSSTring * versionString;
    versionString = [[[NSBundle mainBundle] infoDictionary] objectForKey:CFBundleShortVersionString];[/tt]
  • mac_manumac_manu Membre
    01:42 modifié #3
    Merci Antilog pour la réponse. Oui, ça devrait convenir. Il y a juste encore un petit détail. Dois-je mettre ces lignes de code à  en endroit spécial? Parceque le message d'erreur me dit que CFBundleVersion is undeclared!!
  • 01:42 modifié #4
    Plutôt que de chercher la version de ton application, à  ta place je ferais en sorte de savoir avec quelle version de ton appli le document a été créé. Si tes documents sont de type bundle, l'info est à  mettre dans le info.plist du document (et pas celui de l'appli) et si tes documents sont de type fichier "monobloc", mettre un préfixe ou un truc dans le genre.
  • mac_manumac_manu Membre
    01:42 modifié #5
    C'est bon, j'ai trouvé! Il fallait @CFBundleShortVersionString au lieu de CFBundleShortVersionString !! Encore merci
  • AntilogAntilog Membre
    01:42 modifié #6
    dans 1170242954:

    C'est bon, j'ai trouvé! Il fallait @CFBundleShortVersionString au lieu de CFBundleShortVersionString !! Encore merci


    Autant pour moi! Comme excuse, je ne suis pas sur un Mac...

    Sinon, la réponse de Renaud est tout à  fait pertinente, la vrai question est:
    quelle est la différence de version entre le document que j'essaye de lire et la version de l'application. Et pour ça, il faut stocker la version dans le doc.

    A faire dès maintenant, ainsi:
    - pas de numéro de version => version "ancienne" à  convertir
    - un numéro de version = version de l'appli => ok

    Cdlt
  • Eddy58Eddy58 Membre
    01:42 modifié #7
    En effet, il est plus logique d'insérer une information de version de fichier dans le fichier lui-même. Pour compléter ce qui a été dit plus haut, je voudrais souligner l'existence des méthodes de classe +setVersion et +version de NSObject, dont l'usage est spécialement prévu pour ce genre de cas : :)

    Tu commences par utiliser setVersion en surchargeant la méthode initialize
    [tt]
    @implementation MaClasse

    +(void)initialize
    {
    [MaClasse setVersion:1];
    }

    /* ... */
    [/tt]

    Ensuite dans ta méthode initWithCoder tu récupères le numéro de version de ton archive et ensuite tu fais tes tests avec :
    [tt]
    -(id)initWithCoder:(NSCoder *)coder
    {
         int version = [MaClasse version];
         /* ... */
    [/tt]
  • tabliertablier Membre
    01:42 modifié #8
    J'ai déjà  fait cela pour les applis "Bundle" et les applis "ressource".
    Ci-joint fichier un compacté qui ne contient plus que les 2 méthodes de prise des versions.


    [Fichier joint supprimé par l'administrateur]
  • AliGatorAliGator Membre, Modérateur
    01:42 modifié #9
    Ahhh c'est ça le "_version" qu'on voit quand on fait un class-dump (ou un coup de otool)... Les fois où j'ai utilisé ces outisl je me suis dit "tiens, y'a un numéro de version pour chaque objet, sympa, je me demande si on y a accès et si on peut l'utiliser, ça pourrait être utile faudra que je regarde la doc un de ces jours là  dessus" et j'ai jamais pris le temps  :)
    Encore une info utile à  noter dans un coin de sa tête, ça  :P
  • mac_manumac_manu Membre
    01:42 modifié #10
    Merci pour ces réponses. Juste une demande de précision part rapport à  la réponse d'Eddy58:

    Si je mets:

    +(void)initialize
    {
      [MaClasse setVersion:1];
    }

    lorsque je lis la version dans initWithCoder avec: int version = [MaClasse version]; version = 1, j'ai directement la valeur mise par initialize, mais pas la valeur de l'ancienne version. Donc ça sert pas à  grand chose, à  moin que je n'ai pas tout compris ?!
  • laurrislaurris Membre
    01:42 modifié #11
    Je débarque sur ce fil donc j'espère que je parle bien de la même chose ... et donc, pour répondre à  mac_manu, je dirais qu'il faut mettre le setVersion: dans le encodeWithCoder: et encoder la variable version dans le fichier.
    (D'ailleurs, la dénomination "version" me parait assez arbitraire dans ce cas précis. n'importe quelle variable custom ferait l'affaire , non ?)
  • Eddy58Eddy58 Membre
    février 2007 modifié #12
    dans 1170409556:

    Si je mets:

    +(void)initialize
    {
       [MaClasse setVersion:1];
    }

    lorsque je lis la version dans initWithCoder avec: int version = [MaClasse version]; version = 1, j'ai directement la valeur mise par initialize, mais pas la valeur de l'ancienne version. Donc ça sert pas à  grand chose, à  moin que je n'ai pas tout compris ?!


    Les versions d'archives permettent à  ton soft de se répérer. Par exemple, ci-dessous, ton soft est en version 2. Si il ouvre une archive de version 1, il se contentera d'initialiser les instances en settant var1 et var2, et ignorera var3 et var4. Si il ouvre une archive de version 2, il settera aussi var3 et var4.

    [tt]
    -(id)initWithCoder:(NSCoder *)coder
    {
          int version = [MaClasse version];

          [self setVar1:[coder decodeObject]];
       [self setVar2:[coder decodeObject]];
         
          if (version==2)
          {
         [self setVar3:[coder decodeObject]];
         [self setVar4:[coder decodeObject]];
          }
    return self;
    }
    [/tt]

    Dans ta méthode initialize, tu as juste à  changer le numéro selon la version de ton soft. :o

    @laurris : Pas la peine de se compliquer, les APIs proposent une méthode simple pour initialiser proprement tes instances, autant s'en servir.
  • mac_manumac_manu Membre
    01:42 modifié #13
    Merci Eddy58, j'avais bien compris. Mais où mets-tu ton code initialize ? Si je le mets dans la Class MaClass et que je lis la version de MaClass après dans initWithCoder, comme l'objet que j'initialise ressoit l'ordre initialize avant initWithCoder, eh bien le no de ma version est la même tout le temps!! T'es d'accord avec ce que je dis ou pas ?
  • AliGatorAliGator Membre, Modérateur
    01:42 modifié #14
    Non, tu lis ta version dans initWithCoder (donc quand tu lis ton fichier), et tu écris la version de ta classe dans le encodeWithCoder, donc quand tu écris ton fichier !

    Ainsi avec la version 1 de ton soft, tu ne vas que lire et écrire des documents et classes en version 1.
    Avec ta version 2 de ton soft, tu ne vas écrire que des documents version 2, mais au moment de lire un document, s'il a été écrit avec la version 1 de ton soft tu liras un numéro de version 1
    (la version par défaut d'une classe vaut 1.0 si tu ne la modifies pas avec setVersion)
  • mac_manumac_manu Membre
    01:42 modifié #15
    OK, c'est pigé maintenant, et logique. Merci AliGator !!
Connectez-vous ou Inscrivez-vous pour répondre.