Produire une application compatible avec plusieurs versions de MacOS
UniX
Membre
J'ai plusieurs questions :
1) Je développe sur un Mac Intel. J'ai passé les options de compilation sur ppc + i386 pour faire un universal binaries. Mais dès que j'active la compilation ppc (seul ou avec i386), j'ai les warnings suivants :
2) A priori ça déconne sur 10.3. L'appli se lance normalement, mais après il y a des phénomènes étranges.
Par exemple, le menu Importer des cartes ne fait rien.
J'ai vérifié mes nibs, aucun ne présente d'incompatibilités avec 10.3, et lors du développement, j'ai bien fait attention de n'utiliser que des classes et méthodes bien présentes dans cet OS ....
Comment je peux faire pour voir ce qui pose problème ?
Edit : pour la question 2, j'ai regardé dans la console, et en fait j'utilise selectItemWithTag de NSPopUpButton qui n'est que 10.4 ....
Question subsidiaire : y a t-il dans Xcode un outils permettant d'identifier les erreurs suivant une target d'OS ?
1) Je développe sur un Mac Intel. J'ai passé les options de compilation sur ppc + i386 pour faire un universal binaries. Mais dès que j'active la compilation ppc (seul ou avec i386), j'ai les warnings suivants :
2) A priori ça déconne sur 10.3. L'appli se lance normalement, mais après il y a des phénomènes étranges.
Par exemple, le menu Importer des cartes ne fait rien.
J'ai vérifié mes nibs, aucun ne présente d'incompatibilités avec 10.3, et lors du développement, j'ai bien fait attention de n'utiliser que des classes et méthodes bien présentes dans cet OS ....
Comment je peux faire pour voir ce qui pose problème ?
Edit : pour la question 2, j'ai regardé dans la console, et en fait j'utilise selectItemWithTag de NSPopUpButton qui n'est que 10.4 ....
Question subsidiaire : y a t-il dans Xcode un outils permettant d'identifier les erreurs suivant une target d'OS ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Other Linker Flags -bind_at_load
Dans les settings du projet. Sous toutes réserves car je ne retrouve pas le projet ou j'ai fait cela!!!! ???
tablier: tu ne peux pas avoir faux, c'est la suggestion faite à la dernière ligne de la capture.
Il me reste un soucis : j'utilise la méthode stringWithContentsOfFile:encoding:error: dispo que depuis 10.4, elle remplace stringWithContentsOfFile: qui n'est valable que pour 10.3 et antérieurs.
Donc, comment je fais pour une appli devant tourner sur 10.3 et 10.4 ???
[tt]if (NSAppKitVersionNumber < NSAppKitVersionNumber10_4) {
// le code pour panther
} else {
// le code pour tiger
}[/tt]
Il ne faut pas utiliser ici les #ifdef car ton but est de produire un exécutable unique pour différentes versions de MacOS.
Les #ifdef sont utiles pour des opérations de débuguage uniquement, c'est ça ?
Bon, pour faire simple: le compilateur commence par générer un fichier dit intermédiaire et compile ensuite ce fichier. Les conditions #ifdef sont vérifiées au moment de la génération de ce fichier intermédiaire pour ignorer ou au contraire utiliser certaines portions du code si les dites conditions sont remplies. Mais si une portion de code doit être ignorée, cela veut tout simplement dire qu'elle n'apparait pas dans le fichier intermédiaire et donc évidemment pas dans l'exécutable final. Or dans ton cas ce qu'il faut c'est avoir les 2 versions dans l'exécutable et déterminer en cours d'exécution quelle méthode utiliser.
Donc oui, c'est utile notamment pour le débugage, mais aussi si tu dois faire du code spécifique à une architecture donnée (intel vs ppc ou 32bit vs 64bit par exemple, vu que les exécutables utilisés sont évidemment différents).
À connaà®tre...
[edit]
On me signale (merci Renaud !) que j'ai été un peu vite en besogne. La méthode testée ici est une méthode de classe, donc il faut la tester sur la classe.
Le principe du respondsToSelector, lui, reste bon
[/edit]
+
Chacha
Pour ma part, j'ai mis en oeuvre la méthode de Renaud qui convient très bien.
En revanche, je rencontre toujours des problèmes sur 10.3 :
1) Bizarrement, en passant le logiciel d'un Mac à l'autre via une clé USB formattée FAT32, des ressources sont renommées en majuscules ...! Du coup, l'appli ne les trouve plus .... C'est normal ça ? C'est la première fois que je vois des fichiers renommés tous seuls ....
2) Lorsque je lance une opération d'importation de carte, le processus se passe à priori normalement, mais au moment d'afficher la tableView mise à jour avec la nouvelle carte, l'appli plante et quitte, sans ne laisser aucun message dans le log .... Alors, là , comment savoir ce qui fait planter ?
Pour les ressources, le phénomène se produit sur une clé FAT32, mais pas sur une MacOS étendu ... C'est en fait mes images (certaines seulement ...) qui sont dans le dossier Ressources du package de l'appli qui passent en majuscules ... Toujours las mêmes ! Je ne l'explique pas .... Si quelqu'un peut
Pour le plantage, j'y suis allé petit à petit en supprimant des morceaux de code, et j'ai trouvé d'ou ça vient.
Dans les méthodes data source d'une tableView, j'ai un if([chaine isEqualToString:@""]). Si chaine est nil, plantage .... Mais sur mon iMac, ça marche nickel, même avec nil ...!
Du coup, je sais pas si c'est lié à l'OS (10.3 et 10.4) ou à l'architecture (PPC et Intel) ...
[edit]
En y réfléchissant bien, ce ne doit pas être lié à l'architecture, mais bien à l'OS, car j'ai fait tout le début du développement sur un PPC, et ça ne plantait pas.
[/edit]
Je te renvoie sur ce message qui répond à la question "que se passe-t-il quand on appelle une méthode sur nil et qu'on espère récupérer une valeur"
+
Chacha
Ce qui veux dire que dans le filesystem FAT16, les noms de fichiers sont stockés en majuscule sur le disque.
Oui bon sauf que tu dis que ton disque est formatté en FAT32 et pas en FAT16, mais je suppose que tu as confondu les 2 ?
Le plus simple si tu veux transférer des applis via un filesystem autre que HFS ou HFS+ c'est de le zipper
Le plus étrange : je copie l'appli sur la clé depuis mon ordi 10.4, les noms sont intacts, je la branche sur mon ordi 10.3, les noms ont changés, je la remets sur mon ordi 10.4, ils sont de nouveau intacts ....
Et ce n'est que certains fichiers, pas tous ....
C'est peut-être 10.3 qui gérait mal à l'époque la casse des noms de fichiers sur le filesystem FAT32 ?
Enfin bon c'est sûr que c'est un peu étrange, mais vu les quelques différences du format FAT par rapport au HFS+ c'est vrai que pour les bundles, un zip est quand même plus sûr.
Bon, de toutes façons, comme tu le dis, il suffit de zipper l'appli, et tout rentre dans l'ordre. J'ai même fait mieux, j'ai reformaté la clé en HFS+
Sinon, trouvé sur la mailing-list d'Apple : (Donc si ton disque fait moins de 2Go, genre une clé USB (...), il a sûrement formatté en FAT16 (d'où le passage en majuscules du coup).
"si tu fais un Pomme-I sur ton volume, le Finder te dit que c'est FAT32, mais je me demande s'il n'affiche pas ça même si c'est du FAT16. A vérifier car il me semble que j'avais remarqué qqch dans ce cas."
MacOS X reconnait bien le Fat16, j'ai acheté une clé usb et mac os x me disait que c'était du Fat16. Voilà .
+
En fait je pense que c'est à un moment où je voulais savoir si l'utilitaire de disque formattait en FAT16 ou FAT32, j'avais dû tester avec genre une clé USB et un disque dur externe, et les 2 ne m'affichant pas la même chose, j'avais pensé que le Finder s'embrouillait. Alors que c'était la règle de la limite des 2Go qui devait s'appliquer (cf ma citation post précédent)
Donc à mon avis c'est moi qui m'était embrouillé à cette époque