[Résolu] Préférences : la menace fantôme
Bonjour,
Il m'arrive un truc bizarre. Peut-être pourrez-vous m'aider à y voir clair?
Mon application enregistre ses préférences de manière standard, je ne touche à rien et je laisse faire. Le fichier se trouve au bon endroit (Bibliothèque.Préférences.com.myCompany.myApp.plist).
J'essaie de le mettre à la corbeille pour voir si mon application le recrée correctement à partir d'un fichier plist dans le bundle de l'application. Encore une fois, tout baigne sauf...
Que réapparaissent d'anciennes clés que j'avais éliminées depuis longtemps.
J'ai vérifié partout d'où elles pouvaient sortir: code, IB, plist... rien. Ces clés n'apparaissent nulle part. Et pourtant elles ressurgissent.
Pire encore, les nouvelles clés réapparaissent avec les anciennes valeurs, et pas celles du plist dans mon bundle. Elles ne sont donc pas réinitialisées.
Pourtant c'est bien le fichier dans lequel mon appli va écrire, j'ai vérifié. Alors d'où sortent ces anciennes valeurs? Est-ce le système qui "ressuscite" mon plist détruit?
Mes Macs sont hantés... d'ailleurs, il y a un esprit frappeur: le mien, contre les murs, depuis deux jours...
Réponses
Céroce, merci pour la réponse.
Deux choses:
D'abord, en éliminant mon application avec un utilitaire (CleanMyMac pour ne pas le nommer) je me suis aperçu qu'il y avait en effet une kyrielle de fichiers liés, dont je n'avais aucune idée. Après ça, tout roule et MacOS me demande "Vous démarrez <Toto> pour la première fois, bla bla bla"
Ensuite, cette histoire semble remonter à Lion d'après cet article :http://reviews.cnet.com/8301-13727_7-20093292-263/lockfiles-and-other-plist-file-subtypes-in-os-x-lion/
Je cherche encore, parce que je compte distribuer mon application sous forme de package et que j'aimerais bien savoir quels nettoyages effectuer lors de l'installation...
C'est normal, il y a un système de cache dans NSUserDefault (performance + sandboxing).
Si tu as besoin de vider des préférences depuis la ligne de commande il faut le faire impérativement avec la commande default.
D'autre part, la mise à jour d'anciennes clefs & cie ne doit pas être faite par ton package d'installation (car il ne pourrait pas faire la MAJ des préférences des utilisateurs non connecté).
Il est impératif de le faire depuis ton application au premier lancement avec des préférences périmés.
Cela implique de toujours prévoir un numéro de version dans ton fichier de préférence.
OK, yoann, merci pour ces précieuses indications.
J'avoue n'avoir jamais utilisé la ligne de commande, je ne saurais pas où la trouver ni quelle syntaxe Unix utiliser (honte pour quelqu'un qui programmait sous Unix quand la plupart d'entre vous n'étaient que des lumières dans les yeux de leurs pères)
Ah ça, par contre, j'aurais pu y songer, mais je ne l'ai jamais fait. Cela suppose une sorte de "versionning maison" au lancement du programme, genre:
if ([userDefaults valueForKey: @version]integerValue is trop petite) [self resetPreferences]; ?
Oui, ou plus proprement une classe de conversion qui est lancé en premier sur NSUserDefault et qui va appliquer un process de MAJ en fonction de la version source.
Comment faire ça de manière sûre, puisque le nib est chargé dans un ordre non prévisible?
Quel rapport avec un NIB ? Ou avec un ordre de chargement des clés non ordonné ?!
Bon, jusqu'à Mavericks, j'ai toujours plus ou moins changé mes clés au fur et à mesure de mes besoins (une nouvelle clé se crée automatiquement dans le fichier et les anciennes disparaissent toutes seules (eh oui, j'avoue que j'allais parfois jeter un coup d'oeil dans la plist). Mais là , d'un coup, je voyais d'anciennes clés rester obstinément en place, voire revenir d'outre-tombe, et donc je m'inquiétais... visiblement à tort.
Donc en fait, si je veux "oublier" la clé machin de la version 3.2, je n'ai qu'à la rebaptiser clé truc dans la 3.3, et j'aurais ma "réinitialisation" ?
Ou plus simplement tu convertis tes anciennes valeurs (composition d'une nouvelle clef avec d'anciennes valeurs, ajouts de valeur par défaut, suppression de clefs...).
Je ne comprends pas vraiment ce qui est difficile ici.
Je vois pas ce que tu appelles oublier la clé machin, ou rebaptiser une clé.
Par exemple dans la 2.2 tu avais une clé disons notifyEvents pour permettre à l'utilisateur de dire s'il acceptait de recevoir une notification. Disons que dans la 2.3 tu affines tes préférences en séparant en 2 clés notifyMyEvents et notifyOtherEvents pour permettre à l'utilisateur plus de latitude dans ses choix.
- à‰videmment si l'utilisateur avait installé la 2.2 on va récupérer la valeur de l'ancienne préférence notifyEvents comme valeur par défaut pour les nouvelles clés notifyMyEvents et notifyOtherEvents tant qu'à faire.
- Et si cette clé n'existe pas car l'utilisateur n'a jamais installé la 2.2 avant bah on choisis une valeur par défaut arbitraire et basta.
Qu'est ce que tu trouves de compliqué la dedans ?
Exactement ce que tu fais dans ton exemple: rebaptiser notifyEvents en notifyMyEvents... <_<
En fait, le souci ne venait pas de la gestion des préférences (je fais ça depuis quatre ans) mais de la nouvelle façon de mettre les préférences en cache par le système. Maintenant j'ai compris et j'utilise la console pour repartir à zéro dans les prefs.
Je reprends mon sujet du début:
Je n'ai jamais parlé de tripoter des clés, mais de détruire le fichier de préférences, pour simuler une installation chez un client.
Je crois qu'Ali et moi avions compris que tu cherchais à faire un script d'installation pour faire cette mise à jour de clef chez ton client et non remettre à zéro ta machine de dev.
Désolé alors, je n'ai pas su me faire comprendre. Mais ce qu'il y a de bien, c'est que même quand vous répondez à côté da ma question, j'apprends plein de choses!
J'utilise la console pour détruire le fichier prefs et ça marche.
Et d'où mon lien vers la doc de la commande qui explique qu'il faut quitter l'appli avant de ça faire ça sinon le fichier va se recréer quand tu vas quitter ton appli
Aaaah, mais je ne regrette pas ce qui a suivi, AliGator :-)
::) La menace phantôme: Georges Lucas, Le retour !!!
Pour ceux qui aiment bien. Ce mardi soir sur la 6: La menace fantôme, épisode 1 de "Star wars"
Tablier... rejoins-moi du Côté Obscur...