🐨

Swiftで環境変数を設定する方法

2025/02/11に公開

FlutterとかReact Nativeとかその他プログラミング言語みたいに.envではなかったのでメモがてら。

方法

1. xcconfigファイルを作成

Templeate File作成から「Configuration Setting File」を選択


ファイル名は適当でいいので、デフォルトの「Config」にする。


拡張子がxcconfigのファイルが作成されました。
Xcodeだと歯車アイコンになります。


中に設定する値を書きます。

Config.xcconfig
API_ENDPOINT=https:/$()/jsonplaceholder.typicode.com/


2. プロジェクトで読み込めるようにする

「Project」→「Info」→「Configurations」を開く


読み込ませたいTargetsのBased on Configuration Fileをクリック
先ほど作成した「Config.xcconfig」が出てくるので設定


こうなればOK


3. Info.plistに追加

「Targets」→「Info」→「Custom iOS Target Properties」に追加
※API_ENDPOINTにしたいんですが、既存のKeyが予測に出て変換されちゃうから頭にENVをつける

4. アプリ側で表示

アプリ側で読み込みます。
lazyを使うかinit関数のどちらかを使用します。
読み込んだ環境変数をもとに更に別の変数やクラスを初期化するケースがあるので僕はinit関数を使ってます。(lazyだとできない)

EnvSettingScreenView.swift
//
//  SwiftUIView.swift
//  ai_chat_app
//
//  Created by 池内隆人 on 2025/02/11.
//

import SwiftUI

struct EnvSettingScreenView: View {
    let apiEndpoint: String?
    
    init() {
        self.apiEndpoint = Bundle.main.object(forInfoDictionaryKey: "ENV_API_ENDPOINT") as? String
    }

    var body: some View {
        Text("Hello, World!")
        Text(apiEndpoint ?? "")
    }
}

#Preview {
    EnvSettingScreenView()
}

検証

表示できた

ちなみにこういう方法もある

「Product」→「Scheme」→「Edit Scheme」を開く


「Run」内の「Environment Variables」にKey Valueを記載。


そしてProcessInfoを使って読み込む。

EnvSettingScreenView.swift
//
//  SwiftUIView.swift
//  ai_chat_app
//
//  Created by 池内隆人 on 2025/02/11.
//

import SwiftUI

struct EnvSettingScreenView: View {
    let apiEndpoint: String?
    
    init() {
        self.apiEndpoint = ProcessInfo.processInfo.environment["ENV_API_ENDPOINT"]
    }

    var body: some View {
        Text("Hello, World!")
        Text(apiEndpoint ?? "")
    }
}

#Preview {
    EnvSettingScreenView()
}

上記の方法でできますが、Xcodeからの直接ビルドのみしか対応してないっぽいので使えないですね。
完全に個人で開発 + Gitで履歴も残さないのであれば上記の方法でも良いかと思います。

ヘッドウォータース

Discussion