在Swift中引用环境变量

zte4gxcn  于 2023-03-16  发布在  Swift
关注(0)|答案(6)|浏览(183)

有人知道我怎么在Swift中获取环境变量吗?

lqfhib0f

lqfhib0f1#

Swift 3及以上:

import Foundation

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

avwztpqn2#

沿着Oleg提到的基于NSProcessInfo的方法之外,还可以使用标准的C getenv函数访问环境变量,如下所示:

斯威夫特2.x:

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

斯威夫特3.0:

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

还可以使用setenv函数 * 设置 * 环境变量:

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

我之所以提到设置变量的能力,是因为这是我所知道的在Xcode Playground中工作时设置变量的唯一方法。
最近我想查看一个奇怪的CGContext错误的回溯,这个错误是我在操场上使用“live”视图时遇到的,默认情况下,回溯不会显示在控制台中,所以我必须设置CG_CONTEXT_SHOW_BACKTRACE环境变量来查看发生了什么:

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

在那之后,一切都很顺利,除了我遇到的CGContext错误,但那是另一天的主题了。
希望这有帮助!

**P.S.**上述函数需要导入Darwin模块。Foundation自动导入Darwin,但我认为我还是应该提到它。

46scxncf

46scxncf3#

是的,这是可能的。使用ProcessInfo
简单举例:

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

}
x7rlezfr

x7rlezfr4#

自Swift 3以来,NSProcessInfo已被重命名为ProcessInfo。方法processInfo()已被属性processInfo取代。

import Foundation

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

7hiiyaii5#

Vapor特定解决方案:
从Vapor自动生成为项目模板的代码中:

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

jslywgbw6#

或者,您可以使用Info.plist文件存储应用在运行时所需的构建时env变量,如apple developers forum所述:
例如,如果您有一个MyConfig.xcconfig文件,如下所示:

MY_SECRET_API_KEY = mysupersecretapikeyvaluehere

在您的Info.plist中,您应该添加如下条目:

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

最后,在代码中读取变量的值,如下所示:

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)")

相关问题