Déterminer version application
mac_manu
Membre
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...
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...
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
[tt]NString * version;
version = [[[NSBundle mainBundle] infoDictionary] objectForKey:CFBundleVersion];[/tt]
ou
[tt]NSSTring * versionString;
versionString = [[[NSBundle mainBundle] infoDictionary] objectForKey:CFBundleShortVersionString];[/tt]
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
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]
Ci-joint fichier un compacté qui ne contient plus que les 2 méthodes de prise des versions.
[Fichier joint supprimé par l'administrateur]
Encore une info utile à noter dans un coin de sa tête, ça :P
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 ?!
(D'ailleurs, la dénomination "version" me parait assez arbitraire dans ce cas précis. n'importe quelle variable custom ferait l'affaire , non ?)
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.
@laurris : Pas la peine de se compliquer, les APIs proposent une méthode simple pour initialiser proprement tes instances, autant s'en servir.
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)