Reputation: 1509
Does anybody know how I can grab an environment variable in Swift?
Upvotes: 106
Views: 62637
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
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
Reputation: 42838
Swift 3 and up:
import Foundation
if let value = ProcessInfo.processInfo.environment["KEY"] {
...
}
Upvotes: 138
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
Reputation: 15512
Yes it is possible. Use ProcessInfo
for that.
Simple example :
let dic = ProcessInfo.processInfo.environment
if dic["VAR"] != nil {
}
Upvotes: 17
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