製品版には必要ないけれど、開発中にあると便利な設定項目を再ビルドなしで変更したいというシチュエーションが開発をしているとあるかと思います。そんなときに何か方法はないかと思い試してみた方法をご紹介します。
例: データ参照先(URL、Local 等)の切り替え、ランダムにわざとなんらかの動作が失敗するような仕込みの On/Off
概要
意外とアプリの設定用途として使われていない Settings.bundle を利用します。ビルド設定とビルドスクリプトを併用して特定ビルド(例えば Debug ビルド)だけ Settings.bundle を含むようにします。こうすることで、間違って App Store にデバッグ用 Settings.bundle の含まれたものを申請してしまうことを回避できます。
制限事項
- 製品版で Settings.bundle を使用しないアプリであること
- 若干テスト用の動作切り替え部分のコードが煩雑になる
流れ
- Settings.bundle を作成
- 特定のビルド設定で Settings.bundle を削除するようなビルドスクリプトを追加
- ビルド設定にユーザー定義変数を定義
- 適宜、UserDefaults の任意の値を参照するようなコードを追記
方法
- こちらのドキュメントを参考に Settings.bundle を作成
- ビルドスクリプトを追加
- Xcode のメニューバーから ”Project” > ”New Build Phase” > ”New Run Script Build Phase” をクリック
- 出てきたウインドウに以下のようなスクリプトを記入
if [ "${DELETE_SETTINGS_BUNDLE}" == 1 ]; then rm -Rf "${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME}/Settings.bundle" fi
ユーザー定義変数を定義
- プロジェクトのビルド設定を表示
- 左下のアイコンから Add User-Defined Setting 選択
- 定義名に “DELETE_SETTINGS_BUNDLE” 値に”1″ を設定
まとめ
これらの設定が機能すれば、ビルド時にスクリプトが環境変数の値に応じて Settings.bundle を削除するかどうかを自動で判断します。デバッグ用の UserDefaults を参照するクラスなり関数に、デバッグ用のキーに対する値が無い場合にはデフォルト値(製品版に適用したい値)を返すようにすれば製品版でも正常に動作するはずです。iOS4 の環境だとビルド設定を切り替えて上書きインストールしても前回の Settings.bundle が残っていることがあるので、一旦削除してからインストールするのが安全です。
うまく活用すると効率的なテストができるようになるので、いちど試してみてください。
参考URL
ビルドスクリプトについて
Technical Q&A QA1500: Debugging a WebKit Plug-in in Xcode
Settings.bundle について
iOS Application Programming Guide: Implementing Application Preferences
Configuration Settings File について
Xcode Build System Guide: Build Configurations