Reiss Johnson
Reiss Johnson

Reputation: 1509

Referring to Environment Variables in Swift

Does anybody know how I can grab an environment variable in Swift?

Upvotes: 106

Views: 62637

Answers (6)

Eerik Sven Puudist
Eerik Sven Puudist

Reputation: 2346

A Vapor specific solution:

From the code which Vapor automatically generates as a project template:

let variable = Environment.get("VARIABLE") ?? "or-the-default"

Upvotes: 0

realwoopee
realwoopee

Reputation: 141

Alternatively you can use Info.plist file to store build-time env variables that your app needs at runtime, as described on apple developers forum:

For example if you have a MyConfig.xcconfig file like this:

MY_SECRET_API_KEY = mysupersecretapikeyvaluehere

In your Info.plist you should add an entry like this:

<key>MySecretApiKey</key>
<string>$(MY_SECRET_API_KEY)</string>

Finally in your code read the value of your variable like this:

guard let infoDictionary: [String: Any] = Bundle.main.infoDictionary else { return }
guard let mySecretApiKey: String = infoDictionary["MySecretApiKey"] as? String else { return }
print("Here's your api key value -> \(mySecretApiKey)")

Upvotes: 1

Emil Laine
Emil Laine

Reputation: 42838

Swift 3 and up:

import Foundation

if let value = ProcessInfo.processInfo.environment["KEY"] {
    ...
}

Upvotes: 138

Roman Shamritskiy
Roman Shamritskiy

Reputation: 753

Since Swift 3 NSProcessInfo has been renamed to ProcessInfo. And method processInfo() has been replaced with property processInfo.

import Foundation

for (key, value) in ProcessInfo.processInfo.environment {
    print("\(key): \(value)")
}

Upvotes: 12

Oleg Gordiichuk
Oleg Gordiichuk

Reputation: 15512

Yes it is possible. Use ProcessInfo for that.

Simple example :

let dic = ProcessInfo.processInfo.environment
if dic["VAR"] != nil {

}

Upvotes: 17

Ben Stock
Ben Stock

Reputation: 2026

Along with the NSProcessInfo-based method mentioned by Oleg, you can access environment variables using the the standard C getenv function, like so:

Swift 2.x:

func getEnvironmentVar(name: String) -> String? {
    let rawValue = getenv(name)
    guard rawValue != nil else { return nil }
    return String(UTF8String: rawValue)
}

Swift 3.0:

func getEnvironmentVar(_ name: String) -> String? {
    guard let rawValue = getenv(name) else { return nil }
    return String(utf8String: rawValue)
}

It's also possible to set environment variables using the setenv function:

func setEnvironmentVar(name: String, value: String, overwrite: Bool) {
    setenv(name, value, overwrite ? 1 : 0)
}

The reason I mention the ability to set variables is because it's the only way I know of to set variables when working in an Xcode Playground.

I recently wanted to see a backtrace for a strange CGContext error I was getting when working with a "live" view in a playground. By default, the backtrace isn't shown in the console, so I had to set the CG_CONTEXT_SHOW_BACKTRACE environment variable to see what was up:

setenv("CG_CONTEXT_SHOW_BACKTRACE", "1", 1)

After that, it was smooth sailing. Well, other than the CGContext error I was getting, but that's a topic for another day.

Hope this helps!

P.S. The above functions require the Darwin module to be imported. Foundation automatically imports Darwin, but I thought I should mention it nonetheless.

Upvotes: 41

Related Questions