web-dev-qa-db-fra.com

Comment puis-je accéder à un paramètre de construction Xcode défini par l'utilisateur?

Si j'ai ajouté un paramètre défini par l'utilisateur dans ma configuration de construction, comment puis-je lire ce paramètre dans mon code Objective-C?

J'ai deux fichiers dans mon projet, debug.plist et release.plist. Je veux que mon fichier MainApp.m puisse lire l'un de ces fichiers en fonction de la configuration de construction en cours d'exécution. J'ai configuré un paramètre défini par l'utilisateur nommé "nom de fichier" dans les configurations Debug et Release pour qu'il pointe vers le fichier approprié. Mais je ne sais pas comment mon fichier MainApp.m peut lire la variable de nom de fichier à partir de la configuration en cours.

29
Super Cat

Voici ce que j'ai fait, je ne suis pas sûr à 100% si c'est ce que vous recherchez:

  1. Allez dans le panneau de configuration et choisissez l’icône représentant un engrenage en bas à gauche: ajoutez un paramètre défini par l’utilisateur.
  2. Créez votre paramètre défini par l'utilisateur, par exemple:

    MY_LANG -> en_us
    
  3. Ensuite, dans les paramètres de la macro du préprocesseur, vous pouvez référencer cette valeur:

    LANGCODE="$(MY_LANG)"
    

Vous pouvez maintenant faire référence à LANGCODE dans tous vos fichiers source. Ce sera ce que vous avez rempli dans vos paramètres de construction personnalisés. Je me rends compte qu'il y a un niveau d'indirection ici, mais c'est intentionnel dans mon cas: mon projet XCode contient un tas de différentes cibles/configurations avec leurs propres macros de pré-processeur. Je ne veux pas aller dans tous ces domaines, juste pour changer le code de langue. En fait, je définis le code de langue au niveau du projet. J'utilise également MY_LANG dans quelques scripts, donc juste une macro de préprocesseur ne ferait pas l'affaire. Il y a peut-être un moyen plus intelligent, mais cela fonctionne pour moi.

36
zmippie

Vous pouvez accéder à vos paramètres de construction définis par l'utilisateur au moment de l'exécution (comme suggéré dans un commentaire de @JWWalker)

  1. Ajoutez une entrée à votre fichier Info.plist et définissez-la sur votre paramètre de construction défini par l'utilisateur.

    MySetting -> ${MYSETTING}
    
  2. Lire sa valeur dans le code

    [[NSBundle mainBundle] objectForInfoDictionaryKey:@"MySetting"];
    
14
AndyDeveloper

Votre code ne peut pas lire les paramètres de construction arbitraires. Vous devez utiliser des macros de préprocesseur.

EDIT: par exemple, dans les paramètres de cible pour la configuration de débogage, vous pouvez ajouter DEBUGGING=1 dans le paramètre de génération de macros de préprocesseur, sans définir DEBUGGING dans la configuration de version. Ensuite, dans votre code source, vous pouvez faire des choses comme:

#if DEBUGGING
  use this file
#else
  use the other one
#endif
8
JWWalker

Swift 4 

Disons que "nom de fichier" est la chaîne dont vous avez besoin dans votre application.

Ajoutez le nom de fichier = YOUR_STRING au paramètre défini par l'utilisateur (pour le débogage et la publication).

Et ajoutez le nom de fichier = $ (nom de fichier) à info.plist.

Puis dans le code Swift:

let filename = Bundle.main.infoDictionary?["filename"] as! String
6
Kristian

J'ai essayé zmippie suggestion mais cela n'a pas fonctionné pour moi.

Je l'ai eu avec ça:

${MY_LANG}
6
Morten Holmgaard

Si quelqu'un d'autre est toujours bloqué à la recherche de la procédure de création de macros de préprocesseur, recherchez la section Apple LLVM - Preprocessing dans les paramètres de construction. En dessous, vous verrez une section intitulée Macros de préprocesseur.

C'est là que Xcode insère par défaut la macro DEBUG = 1 pour la configuration de la construction de débogage.

Vous pouvez ajouter les vôtres ici et leur donner différentes valeurs pour le débogage, la publication et toute config de construction personnalisée que vous pourriez avoir.

Pour en ajouter un, double-cliquez sur la liste des valeurs actuelles de la configuration souhaitée. Un petit éditeur sympa avec une macro par ligne apparaît. Ajoutez simplement votre propre nom de macro et donnez-lui une valeur identique à celle de DEBUG.

Celles-ci peuvent être vérifiées pendant la phase de construction du préprocesseur en utilisant #if, #ifdef etc. pour fournir un code ou des valeurs conditionnels.

J'espère que cela pourra aider.

0
Simon Tillson