Xcode
iOS
xcconfig

xcconfigで快適なBuild Settingsライフを

なぜこの記事を書いたか?

XcodeのBuild Settingsメニューで設定する問題点

アプリの様々な設定を主に行うBuild Settingsですが、XcodeのUI的にいくつか問題があります

  • diffが見づらい(debugの設定なのかreleaseなのか読み取れない)
  • テキストファイルのような柔軟な変更ができない(一括置換など)
  • undoできない

ので人的ミスが起こる可能性が高い

xcconfigとは?

Xcode の Build Settings をコードで設定するファイルです。
XcodeのGUIと違って

  • diffがわかりやすい
  • 一括置換などテキスト編集がなんでもできる
  • undoし放題

プロジェクトに導入してみた

手順1:Build Configurationごとの設定ファイルを用意する

Xcodeで新規ファイルを作成する際、Configuration Settings Fileを選択

new_file.png

必要な設定をファイルに書く

Buildする環境ごとに設定が違う場合は、ベースとなるConfigファイルを作って、それをインクルードしたConfig.debug.xcconfigのようなファイルを用意するのが良いです。
他ファイルのConfigファイルの設定は#includeでインクルードできます

project_dir.png

TIPS

Xcode の Build Settings上でcmd+aしてコピペすれば、現在の設定を丸ごとxcconfigにコピーできます

手順2:プロジェクトで設定ファイルを読み込む

PROJECT > ConfigurationsからBuild SchemeごとのConfigファイルを選択
build-setting.png

手順3:設定の反映

Xcode上のBuild Settingsで設定を直書きしている場合、そちらの設定が勝ちます。
そのためxcconfigの設定を反映するためには、Xcode上のBuild Settingsは項目ごとに$(inherited)を指定する必要があります(=設定の行にカーソルを合わせてDeleteキーで削除すればOK)

settings-order.png

ハマったこと

cocoapodsを使っている場合、podsの設定の#includeが必要

cocoapodsが生成したConfigファイルの設定も読み込む必要があるため、
podsの設定を各Configurationごとのファイルで#includeする必要があります

#include "Pods/Pods/Target Support Files/Pods-xxx/Pods-xxx.release.xcconfig"

最終的にこんな感じのファイルになりました

(Config.debug.xcconfigの例)

#include "xxx/xxx/Supporting Files/Config.base.xcconfig"
#include "Pods/Target Support Files/Pods-xxxTarget-xxx/Pods-xxxTarget-xxx.debug.xcconfig"

GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 XXX=1
IPHONEOS_DEPLOYMENT_TARGET = 11.0

... 各設定続く

xcconfigを活用することで、project設定周りの人的ミスをいくらか減らせるかと思います

参考記事

http://qiita.com/paming/items/34f94a829c09eddfee95
http://www.lifeaether.com/self/blog/?p=523