Produire une application compatible avec plusieurs versions de MacOS

UniXUniX Membre
mars 2007 modifié dans API AppKit #1
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 :

warnings_compil.png

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 ?

Réponses

  • tabliertablier Membre
    00:47 modifié #2
    J'ai eu des choses de ce genre et je m'en suis tiré en mettant:

    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!!!!  ???
  • 00:47 modifié #3
    réponse subsidiaire: compile en utilisant le SDK 10.3 (ouvre l'inspecteur pour ton projet, tu auras dans l'inspecteur une option pour le SDK).

    tablier: tu ne peux pas avoir faux, c'est la suggestion faite à  la dernière ligne de la capture.
  • UniXUniX Membre
    00:47 modifié #4
    Merci pour vos réponses Renaud et tablier.

    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 ???
  • 00:47 modifié #5
    Tu te sers de la constante NSAppKitVersionNumber pour vérifier sous quelle version de OS X tourne ton logiciel et exécuter la méthode correcte en fonction du résultat:

    [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.
  • UniXUniX Membre
    00:47 modifié #6
    Oui, j'étais justement en train de regarder le fonctionnement des #ifdef, et j'avais essayer de les placer dans mon code.

    Les #ifdef sont utiles pour des opérations de débuguage uniquement, c'est ça ?
  • 00:47 modifié #7
    C'est plus complexe que ç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).
  • ChachaChacha Membre
    mars 2007 modifié #8
    Il y a une autre technique pour rendre un code dépendant du système, c'est de tester si les méthodes existent !
    <br />if ([monObjet respondsToSelector:@selector(stringWithContentsOfFile:encoding:error:)])<br />{<br />&nbsp; //la méthode est disponible, on peut l&#39;utiliser<br />}<br />else<br />{<br />&nbsp; //utiliser stringWithContentsOfFile:<br />}<br />
    


    À 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.
    <br />if ([[NSString class] respondsToSelector:@selector(stringWithContentsOfFile:encoding:error:)])<br />&nbsp; //la méthode est disponible, on peut l&#39;utiliser<br />else<br />&nbsp; //utiliser stringWithContentsOfFile:<br />
    

    Le principe du respondsToSelector, lui, reste bon
    [/edit]

    +
    Chacha
  • UniXUniX Membre
    00:47 modifié #9
    Effectivement, ça peut être une bonne alternative 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 ?
  • UniXUniX Membre
    mars 2007 modifié #10
    Bon, j'ai fait mon enquête.

    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  :p

    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]
  • ChachaChacha Membre
    00:47 modifié #11
    dans 1173821489:

    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 ...!

    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
  • AliGatorAliGator Membre, Modérateur
    00:47 modifié #12
    dans 1173821489:
    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  :p
    C'est très simple : FAT16 et FAT32 sont tous deux case-insensitive, mais en plus FAT16 n'est pas case-preserving (upper-case) alors que FAT32 l'est.

    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 ;)
  • UniXUniX Membre
    00:47 modifié #13
    Ali, je viens de vérifier, c'est bien FAT32 ...
    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 ....
  • AliGatorAliGator Membre, Modérateur
    00:47 modifié #14
    Ah. Tu l'as formattée avec quoi ta clé ?
    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.
  • UniXUniX Membre
    00:47 modifié #15
    Non, elle a été formatée avec Utilitaire de disque sur 10.4

    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+  :)
  • AliGatorAliGator Membre, Modérateur
    mars 2007 modifié #16
    dans 1173889683:

    Non, elle a été formatée avec Utilitaire de disque sur 10.4

    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+  :)
    Justement il me semble qu'il y a un petit glitch de ce côté là  sous OSX : 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.

    Sinon, trouvé sur la mailing-list d'Apple :
    under Mac OS X using Disk Utility to format the drive as misleadingly named "MS-DOS File System". This limits you to one partition. If the drive is less than 2Gbytes in size, you will get a FAT16-formatted drive; otherwise you get a FAT32-formatted drive. This works for drives larger than 32 Gbytes.
    (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).

  • MathMath Membre
    00:47 modifié #17
    J'ai pas du tout lu tout le topic, mais je voudrais apporter des précisions sur une chose :

    "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à .

    +
  • AliGatorAliGator Membre, Modérateur
    00:47 modifié #18
    dans 1174255422:
    MacOS X reconnait bien le Fat16, j'ai acheté une clé usb et mac os x me disait que c'était du Fat16. Voilà .
    OK, merci de la précision Math :)

    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 :D
Connectez-vous ou Inscrivez-vous pour répondre.