Ați simțit vreodată nevoia de a putea comuta rapid și ușor între configurații, fără a vă deranja cu steaguri de compilatoare sau pentru modificarea manuală a variabilelor în proiectul dvs.? În acest sfat rapid, aș dori să vă arăt o soluție inteligentă pentru această problemă prin folosirea schemelor Xcode și configurațiilor personalizate ale proiectului.
Pentru unele proiecte iOS, aveți nevoie de abilitatea de a comuta rapid între diferite configurații sau medii. Un scenariu comun este atunci când o aplicație iOS comunică cu un API sau un serviciu web. În timpul dezvoltării, trebuie să lucrați într-un mediu de dezvoltare sau staționare. Înainte de a lansa o actualizare, cu toate acestea, probabil că doriți să vă testați aplicația într-un mediu de producție sau de producție. Schimbarea între configurații sau medii poate fi greoaie, mai ales dacă aveți nevoie de acest comutator frecvent.
Cea mai ușoară abordare este să modificați manual configurația de fiecare dată când comutați medii. Aceasta înseamnă modificarea unui semnalizator de compilator sau modificarea manuală a valorilor în proiectul dvs. Această abordare este greșită, obositoare și departe de a fi ideală. O soluție mai bună este crearea unei configurații personalizate pentru fiecare mediu. Aceasta implică crearea unui fișier de configurare care centralizează variabilele de mediu și schemele personalizate Xcode. Permiteți-mi să vă arăt cum funcționează acest lucru prin crearea unui proiect de probă.
Creați un nou proiect în Xcode selectând Cerere goală șablon din lista de șabloane (figura 1). Denumiți aplicația configurabilă, introduceți un identificator al companiei, setați iPhone pentru familia de dispozitive și verificați Utilizați numărarea automată a referințelor. Restul casetelor de selectare pot fi lăsate neschimbate pentru acest proiect (figura 2). Spuneți Xcode unde doriți să salvați proiectul și faceți clic pe acesta Crea.
Figura 1: Alegerea unui șablon de proiect Figura 2: Configurarea proiectuluiIdeea cheie a acestei abordări este de a ști care este configurația actuală. Ce este o configurație și unde sunt definite? Puteți vedea o listă a tuturor configurațiilor proiectului selectând proiectul în Project Navigator și deschiderea Info în partea de sus. Asigurați-vă că ați selectat proiectul în bara laterală din stânga și nu o țintă din lista de ținte (figura 3).
Figura 3: Configurațiile proiectuluiÎn acest tutorial, vom presupune că avem o dezvoltare, un stadiu și un mediu de producție cu care trebuie să lucrăm. Începeți prin a crea o nouă configurație pentru fiecare mediu, făcând clic pe butonul plus de sub lista de configurații. Selectează Duplicați configurarea "Debug" pentru fiecare nouă configurație (figura 4) și dați configurației un nume adecvat (figura 5).
Figura 4: Configurarea duplicat de depanare Figura 5: Trei configurații personalizateCând aplicația rulează, trebuie să fim capabili să aflăm care este configurația curentă. Putem face acest lucru prin adăugarea unei noi intrări în fișierul Info.plist al țintă. Selectați fișierul Info.plist al țintă și creați o nouă pereche cheie-valoare. Setați cheia la configurație și valoarea la $ CONFIGURARE (figura 6). CONFIGURARE identificatorul identifică configurația de construire (de ex., Dezvoltare sau etapă) utilizată de țintă pentru a genera produsul.
Figura 6: Adăugarea unei noi intrări în Info.plistOdată cu aceste modificări, putem aduce acum configurația curentă în aplicația noastră. Pentru a încerca acest lucru, deschideți-l MTAppDelegate.m și actualizare aplicare: didFinishLaunchingWithOptions:
așa cum se arată mai jos. Pentru a accesa informațiile din Info.plist, solicităm pachetul principal de aplicații pentru acesta infoDictionary
. Din dicționarul de informații, luăm valoarea configurație cheia pe care am adăugat-o și le-am conectat la consola Xcode. Construiți și rulați aplicația dvs. pentru a vedea ce este înregistrat în consola Xcode.
- (BOOL): aplicația (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions NSString * configuration = [[NSBundle mainBundle] infoDictionary] objectForKey: @ "Configurație"]; NSLog (@ "Configurație curentă>% @", configurație); // Initialize fereastra self.window = [[UIWindow alocare] initWithFrame: [[UIScreen mainScreen] limite]]; // Configurați fereastra self.window.backgroundColor = [UICcolor whiteColor]; [auto.window makeKeyAndVisible]; reveniți DA;
În ciuda faptului că am creat trei configurații personalizate, configurația curentă este încă setată la debug. Să remediem asta în secțiunea următoare.
La construirea unei aplicații, este utilizată o schemă Xcode. O schemă Xcode definește un număr de variabile de utilizat la construirea produsului. Una dintre aceste variabile este configurația care ar trebui utilizată.
Schema curentă Xcode este afișată în partea din stânga sus a barei de instrumente Xcode. Pentru a comuta cu ușurință între configurațiile (Dezvoltare, Staționare, etc.) pe care le-am creat mai devreme, vă recomandăm să creați o schemă Xcode pentru fiecare configurație. Faceți clic pe schema curentă, selectați Noua schemă din meniul care apare și denumiți noua schemă Dezvoltare. Cu noua schemă selectată, faceți clic pe schemă și selectați Editați schema din meniu. Selectați Rulați configurabil din panoul din stânga, deschideți Info fila din partea de sus și setați Construiți configurația la Dezvoltare (figura 7). Creați o schemă Xcode pentru înscenare și producere configurații prin repetarea pașilor de mai sus.
Figura 7: Crearea unei scheme personalizate XcodePentru a facilita configurarea setărilor de configurare, vom crea o listă de proprietăți personalizate care grupează diferitele setări de configurare. Creați o nouă listă de proprietăți și denumiți-o Configurations.plist (figura 8). Lista de proprietăți este un dicționar cu o intrare pentru fiecare configurație. Fiecare intrare din lista de proprietăți conține un alt dicționar cu informații specifice pentru acea configurație (figura 9).
Figura 8: Creați o listă de proprietăți noi Figura 9: Lista de proprietăți de configurareDupă cum puteți vedea, puteți adăuga oricare variabile Configurations.plist care iti place. Trebuie doar să vă asigurați că fiecare intrare din lista de proprietăți conține aceleași variabile (chei).
Acum aveți toate elementele necesare pentru a comuta rapid între configurații. Cu toate acestea, munca noastră nu sa încheiat încă. Actuala implementare nu este foarte prietenoasă (sau dezvoltatoare). Când adoptăm această abordare, întotdeauna creez o clasă de configurare care îmi oferă un acces ușor la variabilele definite în Configurations.plist. Clasa de configurare preia configurația curentă, încărcările Configurations.plist, și oferă acces facil la variabile. Uitați-vă la MTConfiguration
de mai jos pentru a vedea ce vreau să spun.
#import@ interfata MTConfiguration: marcajul NSObject #pragma - + (NSString *); Marcajul #pragma - + (NSString *) APIEndpoint; + (BOOL) esteLoggingEnabled; @Sfârșit
#import "MTConfiguration.h" #define MTConfigurațiaAPIEndpoint @ "MTAPIEndpoint" #define MTConfigurationLoggingEnabled @ "MTLoggingEnabled" @interface MTConfiguration () @property (copy, nonatomic) NSString * configuration; @property (nonatomice, puternice) NSDictionary * variabile; @end @implementation MTConfiguration #pragma - marca #pragma Configurație partajată + (MTConfigurație *) sharedConfiguration static MTConfiguration * _sharedConfiguration = nil; static dispatch_once_t onceToken; dispatch_once (& onceToken, ^ _sharedConfiguration = [[self alloc] init];); returnați _sharedConfiguration; #pragma marcă - #pragma marca Inițializare privată - (id) init auto = [super init]; dacă (self) // Fetch Configuration Current NSBundle * mainBundle = [NSBundle mainBundle]; self.configuration = [[mainBundle infoDictionary] objectForKey: @ "Configurație"]; // Load Configurations NSString * path = [calea mainBundleForResource: @ "Configurations" dinType: @ "plist"]; NSDictionary * configurations = [dicționar NSDictionaryWithContentsOfFile: calea]; // Încărcați variabilele pentru configurația curentă self.variables = [configurații objectForKey: self.configuration]; întoarce-te; #pragma mark - + (NSString *) configurare return [[MTConfiguration sharedConfiguration] configuration]; #pragma marcaje - + (NSString *) APIEndpoint MTConfiguration * sharedConfiguration = [MTConfiguration sharedConfiguration]; dacă (sharedConfiguration.variables) returnează [sharedConfiguration.variables objectForKey: MTConfigurationAPIEndpoint]; returnați zero; + (BOOL) esteLoggingEnabled MTConfiguration * sharedConfiguration = [MTConfiguration sharedConfiguration]; dacă (sharedConfiguration.variables) return [[sharedConfiguration.variables objectForKey: MTConfigurationLoggingEnabled] boolValue]; retur NO; @Sfârșit
MTConfiguration
clasa oferă acces facil la variabilele stocate în Configurations.plist. Comutarea între configurații este acum la fel de ușoară ca și selectarea schemei corecte Xcode. Chiar dacă ar putea părea un pic de lucru în față, vă pot asigura că vă va economisi o cantitate extraordinară de timp - și frustrare - pe drum.
Pentru a testa soluția noastră, importați fișierul antet al MTConfiguration
clasă în MTAppDelegate.m și actualizați aplicare: didFinishLaunchingWithOptions:
așa cum se arată mai jos.
#import "MTAppDelegate.h" #import "MTConfiguration.h"
- (BOOL): aplicație (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions NSLog (@ "Configurație>% @", [configurare MTConconfigurare]); NSLog (@ "Punct final API>% @", [MTConfiguration APIEndpoint]); NSLog (@ "Logarea este activată>% i", [MTConfiguration isLoggingEnabled]); // Initialize fereastra self.window = [[UIWindow alocare] initWithFrame: [[UIScreen mainScreen] limite]]; // Configurați fereastra self.window.backgroundColor = [UICcolor whiteColor]; [auto.window makeKeyAndVisible]; reveniți DA;
Configurațiile personalizate și schemele Xcode vă pot ajuta într-adevăr să organizați un proiect și să vă eficientizați fluxul de lucru pentru dezvoltare. Sper că v-am putut convinge de valoarea acestei soluții, în special pentru proiecte complexe cu medii multiple.