Configuration application avant compilation
mushu
Membre
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...)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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 ?
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
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...
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 :
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 ?
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->
mais sans succès... ???