Build Configuration毎でinfo.plistの内容を変更する

かんばんわ。
アルザです。

info.plistの内容をビルド毎に変更したい場面があったため調査してみました。
今回は「UIFileSharingEnabled (Application supports iTunes file sharing)」のtrue/falseをビルド毎に切り替えてみます。
試してないけど、URLスキーム等の文字列なんかも切り替える事ができると思う。

XcodeのProject設定の Build Setting を眺めていると「Info.plist Preprocessor Prefix File」という項目を発見。
ここにInfo.plist用のヘッダファイルを指定すればInfo.plist内でdefineを使う事ができそうです。

▼Info.plist Preprocessor Prefix Fileの作成
まずはInfo.plist用のヘッダファイルを作成。
ここではInfoDebugPreprocessor.hとします。

作成したらInfoDebugPreprocessor.hにdefineを定義しておきましょう。

#define DEBUG_FILE_SHARING_ENABLED true

今のところこんな感じ。

▼Build Settingsの変更
Build Settingsの「Info.plist Preprocessor Prefix File」に、作成したInfo.plist用ヘッダファイルを指定。
※プロジェクトからの相対パス指定になるので注意。

更に「Preprocess Info.plist File」をYESに設定しておきます。

▼Info.plistの編集
Info.plistに「Application supports iTunes file sharing」を追加します。
追加後、Info.plistの表示をSourceCodeにしてキーの値を以下のように変更しましょう。
※「Application supports iTunes file sharing」のキーは「UIFileSharingEnabled」になります

<key>UIFileSharingEnabled</key>
<false/>

<key>UIFileSharingEnabled</key>
<string>DEBUG_FILE_SHARING_ENABLED</string>

booleanってどうやって指定するのかと思ったら、普通にで指定しても問題ないみたい。

▼動作の確認
実機で動作させてみて、PC側のiTunesを確認してみると、ファイル共有の箇所に自分のアプリが表示されている事が分かると思います。

これでマクロを使ってInfo.plistの値を指定できた事を確認できたので、だいたいこの時点で目的のほとんどは達成。
あとはビルド毎に値が切り替えられるようになれば完璧です。

プリプロセッサマクロでの切り替え (できなかった)
ところで、(メジャーな手法だと思うけど)私はNSLogによるデバッグログ出力有無を、Build Settings の「Preprocessor Macros」と#ifdef/#else/#endifの組み合わせで切り替えています。
そこで、info.plistの値もプリプロセッサマクロに合わせて切り替えできれば一番シンプルで分かりやすいかな、と安直に考えて調べてみました。

が、結論から言うと、出来ませんでした。。。

InfoDebugPreprocessor.hのdefineを #ifdef/#else/#endif で切り替わるようにしても必ず#elseの値が設定されるようで思うように動いてくれません。
Preprocessor Macros より Info.plist Preprocessor Prefix File の方が先にロードされてるように思えます。

ちなみにその際のInfoDebugPreprocessor.hのコードがコレ。

#ifdef DEBUG
  #define DEBUG_FILE_SHARING_ENABLED true
#else
  #define DEBUG_FILE_SHARING_ENABLED false
#endif

ぐぬぬ…。
※方法があればコメントくださると助かります。。。

▼Build Configuration毎に読み込むヘッダを切り替える
Build Settingsの「Info.plist Preprocessor Prefix File」の項目ですが、他項目と同じくConfiguration毎に分かれているます。
というわけで、プリプロセッサマクロでの切り替えは諦めて、DebugとReleaseで読み込むInfo.plist用のヘッダファイルを分けることにしました。

新しくReleaseビルド用のInfo.plist用ヘッダファイルを作成。
ここではInfoReleasePreprocessor.hとします。

InfoReleasePreprocessor.hにInfoDebugPreprocessor.hで宣言した同名のdefineをfalseで宣言しておきます。

#define DEBUG_FILE_SHARING_ENABLED false

あとはBuild Settingsの「Info.plist Preprocessor Prefix File」のReleaseに「InfoReleasePreprocessor.h」を指定すれば良いです。
Debugの方は「InfoDebugPreprocessor.h」のままね。

とりあえず、Build ConfigurationがDebugの状態で実行してみると、さっきと同様にiTunesのファイル共有にアプリが表示されていることが確認できました。

次はEdit SchemeからRunのBuild ConfigurationをReleaseに変更して実行してみると…
iTunesのファイル共有からアプリが消えました。

ドヤァ。

参考にしたページ。
▼stack overflow - Using preprocessor definitions in iOS App info.plist
http://stackoverflow.com/questions/14206621/using-preprocessor-definitions-in-ios-app-info-plist