外部サービスなどと連携する際に使用するライブラリで本番環境とステージング環境で別々の設定値を用意し、都度切り替える事はよくあるかと思います。
しかし、ライブラリの中には気が利かない環境による設定値の変更がしづらいものがごくたまにあります。
例えば、ライブラリのファイル群の中に特定のファイル名でjsonファイルが用意され、その中の設定値をライブラリが参照している場合など。
ランタイム時に動的に切り替えるようなことができない為、なかなか辛いですが、
コンパイル前に対象のファイルを差し替えることで対応ができました。
各環境用設定ファイルを作成
例えば、ライブラリの構成が以下の通りになっているとします。
/SampleLibrary
├ SampleLibrary.a
└ SampleConfig.json
これを
/SampleLibrary
├ SampleLibrary.a
├ SampleConfig.json
├ prod
│ └ SampleConfig.json
└ dev
└ SampleConfig.json
とします。本番環境用開発環境用の設定ファイルを用意しておきます。
add Run Script
XcodeのBuild Phaseの左上の"+"ボタンよりNew Run Script Phaseを選択し、Scriptを追加します。
追加されたBuild Phaseの「Type a script or drag a script〜」の部分にスクリプトを追加します。
Build Phaseの実行順を変更
重要なのは作ったBuild PhaseをD&Dして、Compile Sources(xxx items) Phaseより前に実行させる事です。
コンパイルされる前にファイルを差し替える必要があります。
Provisioning Profileを見てConfigファイルを差し替える
今回は本番環境、及び開発環境の判定をProvisioning Profileを参照して判定します。
以下のスクリプトを追加したBuild Phaseに書きます。パスなどは適宜差し替えて下さい。
cd "${SRCROOT}"/Sample/SampleLibrary
# 設定ファイルをProvisioning Profileに応じて変更する
if [ ${PROVISIONING_PROFILE} = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ]; then
cp -f ./prod/SampleConfig.json ./
else
cp -f ./dev/SampleConfig.json ./
fi
上記"xxxxxxxx-xxxx〜
の部分をリリースに使用するDistribution Provisioning Profileのファイル名を指定します。
こちらはXcodeのPreferenceから
Accounts > Apple IDを選択 > Teamを選択 > View Details... > Provisioning Profileを右クリック > Show Finder
から取得可能です。
終わり
後はRunするなりArchiveするなりすればProvisioning Profileによって切り替えされると思います!
切り替え対象のファイルが都度差分になるので、gitignoreなどでコミット対象から外してしまうのがいいかと思います。
Provisioning Profileの更新によって都度書き換えなければならないのでベストプラクティスではないのですが、こういうこともできるよ・・という話でした。