Configuration application avant compilation

Bonjour,


 


je gère une application (adHoc) qui doit se connecter en fonction des phases de développement (dev, preprod & prod) à  différents services web.


 


Actuellement ces URLs sont en dur dans le code et lors d'une livraison par exemple, je commente/décomment les URLs nécessaires.


 


Serait-il possible de créer des configuration de projets différentes pour chaque service web et aussi de personnaliser en fonction les bundle identifier et bundle display name ?


 


(ça permettrait d'avoir plusieurs fois l'application sur le même iPad et de reconnaitre sur la home quel appli est mappée sur quel service...)


Réponses

  • AliGatorAliGator Membre, Modérateur
    janvier 2014 modifié #2
    Bah tu fais des Target Xcode différentes, c'est un peu fait pour ;)
  • et à  quoi servent les Schemes ?


    Comment récupérer l'URL de mon service web que j'aurais passé à  la target (dans customiOS Target property j'imagine?) dans le code ?

  • AliGatorAliGator Membre, Modérateur
    Les Scheme c'est un peu différent.

    Les Target permettent de générer plusieurs exécutables distincts à  partir d'un même projet Xcode.
    Par exemple une version Light et une version Full d'une même appli. Ou une version Prod et une version Preprod, et que tu veux que ce soit 2 applis différentes, donc avec des bundleIdentifiers différents, etc.

    Les Scheme c'est plutôt pour faire la correspondance entre les actions (Build, Run, Test...), les Targets à  builder pour chacune de ces actions, les arguments de launch, etc... ce n'est pas vraiment la même chose.
  • Ou bien tu peux faire juste par exemple au démarrage de ton application, tu teste si tu es en mode debug tu affiche une vue ou tu pourra configurer l'url de ton choix ( prod/recette/préprod) comme ça ton application 




  • Ou bien tu peux faire juste par exemple au démarrage de ton application, tu teste si tu es en mode debug tu affiche une vue ou tu pourra configurer l'url de ton choix ( prod/recette/préprod) comme ça ton application 




     


    eeeuuhhh... non

  • Par contre lorsque je défini une variable DataBaseDisplayName dans les Custom iOS Target Properties de ma target,


    dans Bundle display name je passe : "${PRODUCT_NAME} ${DATABASE_DISPLAY_NAME}"


     


    Mais lorsque je compile l'appli, le seul nom affiché est le PRODUCT_NAME...


  • FKDEVFKDEV Membre
    janvier 2014 modifié #8

    Tu peux aussi créer des configurations différentes.


    il y a déjà  Debug, Release,


    Tu peux créer Release_PreProd et Release_Prod.


     


    Pour ça tu sélectionnes Ton Projet, puis Project puis Info.


     


    Je ne sais pas si c'est mieux ou moins bien mais je n'ai jamais accroché avec la notion de targets.


     


    EDIT: 


    Ensuite, dans les build settings, dans "Preprocessor macros", tu mets PREPROD=1 pour la configuration Release_PreProd.


    Dans le code :



    #ifdef PREPROD
    url = @http://...;
    #else
    url=@...;
    #endif

  • AliGatorAliGator Membre, Modérateur


    Par contre lorsque je défini une variable DataBaseDisplayName dans les Custom iOS Target Properties de ma target,

    dans Bundle display name je passe : "${PRODUCT_NAME} ${DATABASE_DISPLAY_NAME}"


    Mais lorsque je compile l'appli, le seul nom affiché est le PRODUCT_NAME...

    si tu ne mets pas la même casse des deux côtés c'est un petit peu normal. Mets tout en majuscule aux 2 endroits (Build Settings ET Plist) par exemple ou tout en CamelCase enfin comme tu veux mais sois cohérent.
  • mushumushu Membre
    février 2014 modifié #10

    Bonjour,


     


    je suis arrivé avec satisfaction à  la solution suivante et je vais tenter de l'exposer ici le plus simplement et exhaustivement possible (Xcode 5.0.2) :


     


    1.  créations d'autant de target que de configurations désirées


     


    2.  chaque target porte le nom de la base de donnée concernée (exemple de nom de target: MON_PROJET preprod-b )


     


    3.  je définis mes infos de configuration:

    sélectionner le projet dans Project Navigator puis sélectionner la target puis onglet Build Settings puis menu Editor->Add build settings->Add User-defined Settings

    j'ajoute 2 variables: DATABASE_DISPLAY_NAME (nom de la bdd affiché dans le bundle display name) et DATABASE_NAME (URL de la bdd)

    pour la release, j'ai un bundle display name différent: debug db name ; release product name 


     


    4.  je "branche" mes 2 variables avec les infos de la target: onglet Info->Custom iOS Target Properties

    je créé une variable DatabaseName (type: String, valeur: ${DATABASE_NAME}), ça me servira à  récupérer la variable dans le code et configurer mes services web avec.

    Je configure aussi le Bundle display name avec ${DATABASE_DISPLAY_NAME}, ça me servira quand j'ai une application livrée à  lire sur quelle base elle est branchée

    (pour avoir plusieurs versions de l'application pour chaque configuration, configurer de manière analogue le bundle identifier, je ne m'étendrai pas plus ici sur ça)


     


    5.  enfin dans le "code", je récupère la base de donnée utilisée de la manière suivante :


     


    6.  Finalement quand avant de build/run/archive mon projet, je sélectionne ma target dans la liste "Set active scheme" à  côté du carré Stop en haut à  gauche


     


     


     


    J'ai néanmoins un dernier souci:


    lorsque je change de target, je dois "cleaner" le projet sinon il reste sur l'ancienne configuration...


    Y a-t-il un moyen d'automatiser ça ?


  • AliGatorAliGator Membre, Modérateur
    Pour ce genre de besoin, en effet ta solution de multiplier les targets est une solution.

    Il y a aussi les concepts de Configuration (il en existe 2 par défaut, qui sont "Debug" et "Release", mais rien ne t'empêche d'en rajouter d'autres). Tu peux ainsi dans tes Build Settings (par exemple pour ton User Defined Build Setting) donner une valeur différente selon la configuration choisie. C'est une autre façon de faire.

    Les targets sont plus pensées/utilisées pour quand tu veux produire plusieurs applications différentes se basant sur un même code. Par exemple une version Lite et une version Pro d'une appli. Tu mets certains fichiers .m seulement dans un des targets, certains autres seulement dans un autre target, certains dans les 2... et ainsi chaque target ne compile pas forcément la même liste de fichiers (le target "VersionLite" ne va pas inclure les fichiers qui ne servent qu'à  la version Pro par exemple.

    Les configurations, c'est plutôt pensé pour permettre de faire basculer facilement un ensemble de Build Settings, comme basculer facilement d'une valeur à  une autre pour ton Build Setting DATABASE_DISPLAY_NAME.


    Après les 2 se valent, il n'y a pas de solution absolue. Et utiliser les targets comme tu as fait ça marche aussi.


    ---

    Sinon c'est bizarre que tu aies à  faire un clean avant chaque build d'un nouveau target, car normalement à  moins que tu aies changé ça dans tes configurations, il me semble que la compilation de chaque target se fait dans un dossier intermédiaire indépendant. En tout cas c'est le cas pour les différentes configurations (Debug/Release).
    Va voir du côté des Build Settings de la section "Build Locations" ("Build Products Path", etc) : tu peux, en utilisant les variables à  ta disposition pour composer un path dynamique dépendant de $(TARGET_NAME) par exemple, mettre comme valeur pour ces emplacement un nom de dossier qui dépend du nom de la Target. Ainsi, la compilation de chaque target se fera dans un dossier différent et donc indépendant des compilations des autres targets.
  • les variables que j'ai défini sont insérées dans le fichier info.plist (étape 4)


    j'ai l'impression que ce fichier n'est pas régénéré à  chaque build...


     


    j'ai tenté d'éditer chacune de mes schemes->Build->Pre-actions->Run script->



    rm ${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH}

    mais sans succès...  ???


Connectez-vous ou Inscrivez-vous pour répondre.