Récupérer des paramètres de build

Salut tout le monde,



Voilà , j'execute une requête avec une URL. Cette URL peut changer en fonction de ce que l'utilisateur fait dans le Settings.app.

Les URL sont toujours les mêmes.

J'aimerai savoir s'il y a un moyen de rentrer mon tableau d'URL dans les paramètre de build (ou une URL selon un scheme particulier) et que mon applicatif choisisse tout seul selon un type de scheme, quelle URL injecter dans ma requête.



Ainsi l'user n'aurait rien à  faire et l'URL envoyé dépendrai juste du scheme choisi lors de la compilation. N'ayant pas trop joué avec tout ça je ne sais pas du tout si c'est possible ...



Merci image/smile.png' class='bbc_emoticon' alt=':)' />

Réponses

  • AliGatorAliGator Membre, Modérateur
    Utilise le build setting "Other C Flags" pour rajouter un flag "-D" équivalent d'un #define dans ton code.

    Tu peux donner à  ce flag des valeurs différentes selon les diverses configuration (par défaut il y a une configuration Debug et une Release, mais tu peux en créer d'autres et affecter des configurations spécifiques à  tes schemes selon tes besoins (j'ai pas trop compris en vrai ce que tu recherchais si c'était en fonction des Build Settings ou des NSUserDefaults appliqués dans Settings.app ?)



    Par exemple pour la configuration Debug tu pourrais définir le flag -DDEST_URL="http://monurl1"; et pour la configuration Release définir le flag -DDEST_URL="http://monurl2". Ensuite bah dans ton code tu utilises DEST_URL comme si tu avais fait un #define DEST_URL "..." au début de ton code, par exemple NSURL* url = [NSURL URLWithString: @ DEST_URL];
  • CeetixCeetix Membre
    juillet 2012 modifié #3
    C'est exactement ça que je veux faire.

    Ca marche bien, mon flag est bien reconnu dans mon code. Par contre impossible de le logger.

    Le compilateur aime pas. "Unexpected '@'; ou stray '@';
  • AliGatorAliGator Membre, Modérateur
    Ah oui puisque les guillemets sont parsés dans la CommandLine je suppose. Donc la macro DEST_URL est évaluée à  l'url sans les guillemets, enfin j'imagine que c'est ce qui se passe et explique l'erreur.

    http://monurl1];[/font][font=helvetica, arial, sans-serif] [/font]il n'aime pas.



    Faut la stringizer quand tu l'utilises dans ton code, en mettant un # devant DEST_URL pour qu'il l'encadre de guillemets. Et bien sûr toujours mettre le @ devant pour en faire une NSString :

    [font=courier new,courier,monospace][NSURL URLWithString:@#DEST_URL];[/font] // sera transcrit à  la précompilation en [NSURL URLWithString:@"http://monurl1"];
  • CeetixCeetix Membre
    juillet 2012 modifié #5
    Ca ne marche toujours pas :/

    Je fais :
    NSLog(@"%@",@#DEST_URL);
    




    J'ai toujours stray @ et stray #
  • AliGatorAliGator Membre, Modérateur
    menu Product -> Generate Output -> Preprocessed File et regarde ce qu'il te génère comme code une fois la macro DEST_URL déroulée
  • J'ai fait ce que tu as dit, je suis sur mon AppDelegate.m (Preprocessed) et je ne vois nul part la macro. J'ai du mal faire un truc ...
  • AliGatorAliGator Membre, Modérateur
    Comment ça tu ne vois nulle-part la macro ?

    Evidemment si tu demandes de générer la sortie du preprocessor, par définition vu que le boulot du preprocessor c'est de dérouler les macros pour les remplacer par leur valeur, c'est normal que tu ne trouves pas DEST_URL dans cette sortie preprocesseur.



    Mais tu vois quoi autour du code où tu as utilisé cette macro ? Elle a été transformée en quoi ? C'est ça la quesiton. Fais une recherche, dans le code généré par le préprocesseur, pour trouver un bout de code / nom de fonction qui est aux alentours de là  où tu as utilisé ta macro DEST_URL, pour trouver rapidement la partie de code qui t'intéresse, et regarde en quoi le DEST_URL de ton code a été transformé par le préprocesseur quand il a transformé la macro.



    Si tu as toujours le texte "DEST_URL" dans la sortie du préprocesseur par contre, c'est qu'il ne l'a pas considéré comme une macro, donc que tu as mal utilisé le flag -DDEST_URL (c'est "-D" suivi du nom de la macro suivi de "=" suivi de sa valeur. Vérifie que tu n'as pas mis "-DEST_URL=blabla mais bien -DDEST_URL=blabla par exemple)
  • JegnuXJegnuX Membre
    août 2012 modifié #9
    Et tu peux pas définir cette URL directement dans le code mais une utilisant quand même les directives de compilateur ?


    <br />
    + (NSString *) baseURLString<br />
    {<br />
    	#ifdef DEBUG<br />
    		return @&quot;http://monurl_debug.com&quot;;<br />
    	#else<br />
    		return @&quot;http://monurl_release.com&quot;;<br />
    	#endif<br />
    }<br />
    




    Je vois juste pas vraiment l'intérêt réel de passer par les other C flags pour ce cas là . C'est un peu se compliquer pour rien non ? D'autant plus que pour la reprise de code par la suite, pour changer l'url on aura plus tendance à  chercher dans le code que dans les C flags...



    Mais sinon, éclairez moi...
  • CéroceCéroce Membre, Modérateur
    Comment définis-tu DEBUG dans ton exemple ?
  • CeetixCeetix Membre
    août 2012 modifié #11
    @Jegnux oui je suis d'accord avec toi mais disons que je ne suis pas tout seul à  statuer sur ça et que les autres préfères cette solution.



    @Ali Ok ok. Je résume. En C flag j'ai donc mis
    -DDEST_URL=&quot;http://monurl&quot;
    




    Ensuite dans mon code j'ai fait :
    NSLog(@#DEST_URL);
    




    Quand je lis le proprocessed outpu j'ai :
    NSLog(@#http:);
    




    Il zappe les '/'. Si j'enlève mon http:// j'ai bien le reste de l'adresse. Par contre je n'ai pas de guillemets d'où le soucis à  la compilation.



    Edit : bon ça marche si je mets en flag :
    -DDEST_URL=&quot;\&quot;http:\/\/monurl\&quot;&quot;
    
  • Oui en effet c'est plus simple ^^

    Merci tout le monde image/smile.png' class='bbc_emoticon' alt=':)' />


  • [font=helvetica, arial, sans-serif]Il zappe les '/'. Si j'enlève mon http:// j'ai bien le reste de l'adresse. Par contre je n'ai pas de guillemets d'où le soucis à  la compilation.[/font]


    C'est interprété comme un commentaire 'C' par le preprocesseur, ce qui est discutable mais bon... Les preprocesseurs, c'est un peu la jungle, y'a pas vraiment de règles claires.



    Une autre technique consiste à  stringifier comme l'a dit Ali mais en passant par deux macros :



    <br />
    #define TOSTR2(X) #X<br />
    #define TOSTR(X) TOSTR2(X)<br />
    




    Bizarrement, ici cela ne fonctionne pas à  cause du "//" qui est interprété comme un commentaire.

    Du coup j'ai essayé le "PASTING" avec l'opérateur ##

    Mais ça ne fonctionne pas non plus... Je laisse tomber.

    [/size][/font][/color]<br />
    <br />
    [color=#74492D][font=Menlo][size=2]<br />
    #define COLLE2(X, Y) X##Y[/size][/font][/color][color=#74492D][font=Menlo][size=2]<br />
    #define COLLE(X, Y) COLLE2(X, Y)[/size][/font][/color]<br />
    <br />
    <br />
    TOSTR[color=#000000]([/color]COLLE[color=#000000]([/color][color=#3900d5]1[/color][color=#000000], [/color][color=#3900d5]2[/color][color=#000000])) //OK =&gt; &quot;12&quot;[/color][color=#1A870F]<br />
    [color=#000000]TOSTR(COLLE( http:/, /hihi.com)) //Erreur &#33;[/color][/color]<br />
    <br />
    
  • AliGatorAliGator Membre, Modérateur
    Sinon tu peux aussi juste définir une valeur dans tes flags genre -DURLIDX=1, et mettre tes URLs dans ton code source, genre
    NSString* destUrlString = nil;<br />
    #if URLIDX=1<br />
     destUrlString = @&quot;http://val1&quot;;<br />
    #elseif URLIDX=2<br />
     destUrlString = @&quot;http://val2&quot;;<br />
    #endif<br />
    NSURL* destUrl = [NSURL URLWithString:destUrlString];
    
  • Oui je suis d'accord avec toi Ali mais le client n'a pas l'air de vouloir le faire de cette manière image/sad.png' class='bbc_emoticon' alt=':(' />
  • TofTof Membre
    août 2012 modifié #17
    Si dans ton projet à  la section "Build Settings/Processing/Preprocessor Macros" tu as défini quelque chose du genre pour Debug:
    TEST=&#092;&quot;http://truc.com/pathDebug&#092;&quot;<br />
    


    et pour Release:
    TEST=&#092;&quot;http://truc.com/pathRelease&#092;&quot;<br />
    




    ou tu peux définir ça dans ton code comme suit:
    #ifdef DEBUG<br />
    #define TEST &quot;http://truc.com/pathDebug&quot;<br />
    #else<br />
    #define TEST &quot;http://truc.com/pathRelease&quot;<br />
    #endif<br />
    




    Tu peux faire ceux ci pour initialiser ta variable :
    NSURL* destUrl = [NSURL URLWithString:@&quot;&quot; TEST &quot;&quot;];<br />
    // En mode Debug on aura:<br />
    //  NSURL* destUrl = [NSURL URLWithString:@&quot;http://truc.com/pathDebug&quot;];<br />
    // et en mode Release on aura:<br />
    //  NSURL* destUrl = [NSURL URLWithString:@&quot;http://truc.com/pathRelease&quot;];<br />
    
  • AliGatorAliGator Membre, Modérateur
    'Tof' a écrit:
    Tu peux faire ceux ci pour initialiser ta variable :
    NSURL* destUrl = [NSURL URLWithString:@&quot;&quot; TEST &quot;&quot;];
    
    Note que les "" avant et après le nom de la macro ne sont pas nécessaires. Donc pour info on peut directement écrire :
    [NSURL URLWithString:@TEST]
    




    Sinon j'en profite pour dire que ce genre de config c'est aussi parfois plus pratique de les écrire dans un fichier de config. Genre prévoir un fichier Debug.xcconfig et Release.xcconfig, chacun ayant la définition souhaitée pour la clé de config OTHER_C_FLAGS, et baser sa config Debug sur Debug.xcconfig et baser Release sur Release.xcconfig.



    Pour créer un fichier de config c'est simple :
    • Créer un nouveau fichier avec le modèle "Configuration Settings File" (le modèle se trouve dans la catégorie "Other"
    • Y écrire chaque clé de config qu'on veut affecter, suivi d'un "=", suivi de la valeur. Mais le plus simple plutôt que d'écrire ces clés à  la main est plutôt de copier/coller les entrées de config. Pour cela, aller dans vos "Build Settings", sélectionnez la ligne qui vous intéresse, faites "Copier", puis retournez dans votre fichier .xcconfig et faites "Coller", il collera le texte correspondant à  la ligne copiée tout seul.
    • Pour baser une configuration donnée (disons Debug) sur votre fichier de config nouvellement créé, et donc qu'il "importe" les clés de config définies par le fichier de config dans cette config (ça ne vous empêchera pas de modifier cette config dans l'onglet Build Settings, ça fait juste une sorte d'héritage des clés du xcconfig si on veut), sélectionnez votre projet dans le Project Navigator, puis sélectionnez votre projet dans la liste de gauche (et non un de vos Target). Dans l'onglet "Info, vous pouvez alors définir les configurations utilisées par votre projet (et rajouter d'autres configs que Debug et Release)... et choisir un fichier de config sur laquelle la config se base.


    C'est plus compliqué à  expliquer qu'à  faire en fait ^^



    Et ça permet d'avoir un fichier texte facilement éditable regroupant les clés majeures qu'on peut vouloir modifier souvent, ou isoler les clés comme ton OTHER_C_FLAGS et les settings qui n'impactent pas forcément directement la façon de compiler le projet mais plus les valeurs de constantes, etc. Ca permet aussi de mutualiser certaines clés entre plusieurs configs (d'autant que dans un fichier xcconfig on peut faire des #import d'autres fichiers xcconfig, et ça c'est pratique des fois !)
Connectez-vous ou Inscrivez-vous pour répondre.