6

I have some dynamic values I need to change based on the type of build I am doing in Xcode.

I have created 2 schemes DEV and PROD and set environment variables in each

enter image description here

I then consume these in code as follows

var serviceDomain: String {
    let envVar = ProcessInfo.processInfo.environment
    guard let value = envVar["APP_SERVICE_DOMAIN"] else { fatalError("Missing APP_SERVICE_DOMAIN enviroment variable") }
    return value
}

Is this the correct way to approach this?

Once an app is compiled, should these values now be bundled with it?

I have an issue in that once I've stopped my simulator, if I try to open an app built this way, it crashes and I suspect the environment variables aren't present anymore.

In short, I would like a build for dev that uses one set of variables and a build for release / production that uses another.

1
  • Regarding environment vars scope, you are right: they are defined by Xcode and, as such, won’t be be present when running your app outside the IDE. You will need to define default values in your code (or an external file) if you want to follow this approach. Commented Jan 15, 2019 at 12:44

1 Answer 1

6

You don't need environment variables at all!

Go to build settings and search for active compilation conditions:

enter image description here

Add DEBUG for Debug and RELEASE for Release as I have done here.

Then declare your variables. Let's say you want a to be 1 in release mode, and 2 in debug mode,

#if RELEASE
let a = 1
#elseif DEBUG
let a = 2
#endif

And that's it!

The compiler will choose one of the values to compile, depending on your scheme's Build Configuration. Here, it is debug, so 2 will be used:

enter image description here

More details on this #if thingy

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you, so I should use that if statement in perhaps some sort of constants file I assume?
@HarryBlue Yes you could put it in a constant file, or anywhere else you like. It doesn't matter.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.