=====✄=====追記 2015/07/28=====✄=====
この方法でも二回目以降のビルドからしか反映されなかったり、Archiveするときに反映されなかったりするので、 @kishikawakatsumi さんの紹介してくださったcocoapods-keysを使う方法が確実です。pod install時にソースを生成するので。
======✄======追記終わり======✄======
Railsとかやってるとリポジトリに含まないファイルである.env
に、ソースコードにまぜちゃいけない色々な情報を埋め込んでおいて、
コードから環境変数として参照とかはよくやるのですが、iPhoneアプリ開発でやったことがなかったので調べてみました。
結果的にはドンピシャなやつがなかったので、自分で色々組み合わせました。
最初ずっと英語で調べていたのですが、諦めて日本語で探したら参考になる記事がわんさかでてきたので、日本のiOSエンジニアの方々のレベルは海外なんかに負けてないと思いました。
手順
-
Preprocess Info.plist file
にYES
を設定する -
<プロジェクト名>-Info.plist
に環境変数名と同じkeyを追加する -
.env
に必要な変数を定義する -
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"環境変数名"];
で参照する (SwiftはNSBundle.mainBundle().objectForInfoDictionaryKey("環境変数名") as String
) -
.env_sample
をつくって.env
は.gitignore
する - Run Scriptに以下のソースを追加する
if [ ${CONFIGURATION} = "Debug" ]; then
plistBuddy="/usr/libexec/PlistBuddy"
infoPlistFileSource="${SRCROOT}/${INFOPLIST_FILE}"
infoPlistFileDestination="${TEMP_DIR}/Preprocessed-Info.plist"
# 今回は関係ないけどビルドバージョンを自動で更新する
currentVersion=$($plistBuddy -c "Print CFBundleVersion" "${infoPlistFileSource}")
versionPrefix="dev-"
lastCommitDate=$(git log -1 --format='%ci')
versionSuffix=" ($lastCommitDate)"
versionString=${versionPrefix}${currentVersion}${versionSuffix}
$plistBuddy -c "Set :CFBundleVersion ${versionString}" "${infoPlistFileDestination}"
# .env内の環境変数を参照できるようにする
. ./.env
$plistBuddy -c "Set :HOGE ${HOGE}" "${infoPlistFileDestination}"
$plistBuddy -c "Set :FUGA ${FUGA}" "${infoPlistFileDestination}"
$plistBuddy -c "Set :PIYO ${PIYO}" "${infoPlistFileDestination}"
fi
環境変数の定義はこんな感じです。
HOGE='ほげ'
FUGA='ふが'
PIYO='ぴよぴよ'
plistも例えばこんな感じです。
で、結局なんですが何回かビルドしたり、クリーンしたりしないと、ちゃんと環境変数を参照できないことを覗いては概ねうまくいきました!
何回かビルドすると最終的に意図通りに参照できるように収束するので問題ないかと。
もっといい方法がありましたら、教えてください!
参考URL
- ios - How can I exclude a secret key from an open-sourced Xcode project? - Stack Overflow
- PlistBuddy(8) Mac OS X Manual Page
- iPhoneの実機デバッグで自動的にMacのローカルサーバーと通信させる - The Powerful Code
- これがXcodeでのバージョニングの決定版になるかも - TOKOROM BLOG
- EZ-NET: Build 番号の自動更新スクリプトで Info.plist そのものに書き込まないための考察
- シェルスクリプトで外部ファイルに記述された変数を利用する方法 | 俺的備忘録 〜なんかいろいろ〜