Skeemoja ja konfiguraatioita

images/default.jpg

Miten määrittää Xcode-projektin asetukset erilaisia käyttötapauksia varten? Tyypillisesti sovelluskehityksessä on tarve ainakin vaihtaa sovelluksen taustajärjestelmän testi- ja tuotantoversion välillä. Olisi myös kätevää jos tiettyjä sovelluksen ominaisuuksia saisi helposti vaikkapa kytkettyä pois päältä. Entä miten tehdä kätevästi buildeja beta-jakelua varten, käyttäen sitä varten luotua Ad Hoc Provisioning Profilea ja eri bundle id:tä? Ja saisiko samalla sovelluksen beta-version nimenkin muutettua?

Xcoden build schemet ja build configurationit tarjoavat näihin asioihin ratkaisun suhteellisen pienellä vaivalla. Kutsukaamme schemejä skeemoiksi ja build configurationeja konfiguraatioiksi kunnes keksimme paremmat suomennokset.

Mitä Xcoden skeemat ja konfiguraatiot ovat?

Skeema määrittää mikä build target (tai targetit) käännetään, ja mitä konfiguraatioita siihen käytetään.

Konfiguraatio on kokoelma asetuksia joita käytetään käännöksessä. Nämä asetukset voivat myös sisältää kehittäjän itse lisäämiä asetuksia kuten käännöslippuja tai esim. sovelluksen taustajärjestelmän osoitteen jota käytämme alla esimerkkinä. Oletuksena Xcode-projektissa on valmiina konfiguraatiot Debug ja Release.

Konfiguraatioilla voidaan toteuttaa mm.

  • Käyttäjän itse määrittelemät asetukset (Targets → [Oma target] → Build Settings → User defined). Esim. sovelluksen käyttämän taustajärjestelmän osoite.
  • Code signing määriteltävissä eri konfiguraatioille (Targets → [Oma target] → General). Automatically manage signing tulee poistaa käytöstä.
  • Bundle id mahdollista määritellä joka konfiguraatiolle erikseen (Targets → [Oma target] → Build Settings → Packaging → Product Bundle Identifier).
  • Käännösliput joka konfiguraatiolle erikseen (Targets → [Oma target] → Build Settings → Swift Compiler - Custom flags). Lippuja hyödyntämällä voi esimerkiksi kytkeä tiettyjä sovelluksen ominaisuuksia päälle tai pois päältä tietyissä konfiguraatiossa.

Useimmissa tapauksissa ei siis välttämättä ole tarpeellista luoda useita eri build targeteja luodakseen erilaisia variaatioita kehitettävästä sovelluksesta. Yksi target sopivasti konfiguroituna taipuu moneen asiaan.

Kuva

Esimerkki: Toteutetaan sovellukseen helposti vaihdettava taustajärjestelmän osoite

  1. Aloitetaan luomalla muutama uusi konfiguraatio.
    1. Klikkaa projektisi ikonia ja valitse Project → Info.
    2. Projektissasi on ennestään konfiguraatiot Debug ja Release. Nimeä ne uudelleen muotoon Debug dev ja Release dev. “Dev” tarkoittaa tässä yhteydessä sitä että kyseinen konfiguraatio tulee käyttämään taustajärjestelmän development- eli kehitysversion osoitetta.
    3. Klikkaa plus-ikonia ja valitse Duplicate “Debug dev” configuration. Kuva
  2. Anna uuden konfiguraation nimeksi Debug prod. Toista konfiguraation duplikointi Release-konfiguraatiolle ja anna uuden konfiguraation nimeksi Release prod. “Prod” tarkoittaa tässä yhteydessä sitä että kyseinen konfiguraatio tulee käyttämään taustajärjestelmän production- eli tuotantoversion osoitetta. Kuva
  3. Luodaan uusi skeema.
    1. Valitse Xcoden pääikkunan vasemman yläkulman pudotusvalikosta Manage schemes.
    2. Oletuksena projektissasi on ennestään yksi skeema. Valitse se, klikkaa asetusikonia ja valitse Duplicate. Nimeä skeemasi vaikkapa näin. Kuva Ei-jaetut skeemat tallennetaan xcuserdata-hakemistoon käyttäjätunnuksesi alle. Tämä hakemisto ei tyypillisesti ole versionhallinnan alaisuudessa. Rastittamalla Shared-valinnan varmistat että skeemasi tallennetaan xcschemes-hakemistoon (.xcodeproj-projektihakemiston sisällä) ja siten ne myös päätyvät versionhallintaan. Jaettuja skeemoja tarvitaan jatkuvaa integraatiota (kuten esim. Jenkins-käännösautomaatio) käytettäessä.
  4. Tuplaklikkaa uutta prod API-skeemaasi. Vaihda kaikkiin kohtiin konfiguraatioksi joko Debug prod tai Release prod.Kuva
  5. Avaa Targets → [Oma target] → Build settings
    1. Lisää User defined -kohtaan API_BASE_URL. Kuva
    2. Avaa Info.plist ja lisää APIBaseURL. Anna sen arvoksi $(API_BASE_URL). Kuva
    3. APIBaseURL:n arvo määräytyy nyt valitun skeeman perusteella. Kuva Se on luettavissa Info.plist:stä kuten muukin Main Bundlen sisältö, esimerkiksi näin:
          if let apiBaseURL = Bundle.main.object(forInfoDictionaryKey: "APIBaseURL") as? String {
              print("APIn base url on: \(apiBaseURL)")
          }

Valmista tuli!

Kokeile myös xcconfig-tiedoston tekemistä

Jos Xcoden käyttöliittymän klikkailu ei ole sinun juttusi, kokeile sen sijaan .xcconfig-tiedoston tekemistä (File → New → File → Other). Kuva

Tiedosto sisältää avain-arvo -pareja. Esimerkkinä käyttämämme taustajärjestelmän osoite näyttäisi xcconfig-tiedostossa tältä:

API_BASE_URL = dev.schemedemo.foo.com

Valitse Project → Info → Configurations ja voit valita konfiguraatioillesi haluamasi xcconfig-tiedostot. Kuva

Vinkki: Jos haluat konfiguroida vaikkapa API-avaimia tai muuta ei-julkista tietoa, voit tehdä salaisuuksillesi oman xcconfig-tiedoston jota et laita versionhallintaan.

Julkaistu 13.09.2019 – Tuomas Ekholm

Lue myös