LoginSignup
60
43

More than 5 years have passed since last update.

超効率化外伝: xcconfigの便利なところ&設定例

Last updated at Posted at 2017-08-09

先日10年ぶりに帰省した時の話をしよう。

実家に着いた直後、出迎えてくれた母は初孫達との初対面を喜ぶも束の間『15分で支度しな』的な事を言い放ち、我々一行を自身のバイト先の卓球場へと拉致した。
気がつくと、初孫達は母の熱い卓球指導を受けていた。

超スピードとかそんな野暮なものでは断じてない。
母は、息子家族の歓迎とアルバイト業を効率的に処理したのである。


※本記事は、後半からAutomatically manage signingとxcconigで超効率化の補足記事にもなっています。併せてお読み頂くと幸いです。


"xcconfig"とは?

正式名称は「Configuration Settings File」。
その名の通りXcodeで使える便利な構成設定ファイルであり、「.xcconfig」がファイルの拡張子となる。

なぜかApple公式のリファレンス群に解説が見当たらない為、積極的に利用して欲しくない理由でもあるのかしら?と勘ぐりたくなるが、恐らく単に解説に割く労力を割愛しているのではないかと思う。

なぜxcconfigを使うのか?(ターゲット利用の弱点)

少し複雑な構成のプロジェクトや量産などの必要がある際に、圧倒的な利便性を発揮する。

例えばまず、Xcodeには「ターゲット(TARGETS)」という概念があり、これを利用することで「個々のターゲットに対して、プロジェクトのビルド設定とは異なる設定を行う」ことが可能だ。

参考: Apple Developer - Xcode Overview

  • 接続先を変更したアプリを社内向け、ストア向けのアプリとして別々に作りたい
  • 大元は共通のソースで管理したい
  • その他、外部ライブラリ等と組み合わせてhogehogeしたい

そういった需要には、このTARGETSやScheme、Workspace等を組み合わせる事でかなり多彩な設定ができるだが、いくつか、割と大きな弱点が存在する。

  • ターゲット向けの設定はXcodeのGUIでしか設定できない
  • ターゲットを複製・編集する手順が煩雑(「元ターゲット名 copy」や「元ターゲット名 copy-info.plist」などをいちいち修正しなければいけない)
  • コピー元のターゲットに変更が生じた場合、コピー先のターゲットにもUIで手動で行わなければいけない
  • それぞれのターゲットの差分が分かりづらい

以上のような理由から、ターゲットの数が増えると管理し辛く、設定ミス等が起こりやすくなるのである。

これらの問題をスタイリッシュに解決する一つの方法が、xcconfigだと考えて欲しい。
また、今回は紹介しないが、設定ファイルがプレーンテキストである事を利用し、ビルド前にスクリプトを流すような仕掛けを入れる事で、例えばbuild番号などを自動的に繰り上げるなどの効率化も可能だ。

作り方と使い方

雛形の作り方は、エディタを用いてプレーンテキストで用意しても良いし、XcodeのFileメニューから
「New」-「File…」から「Configuration Settings File」を選択
…としてプロジェクトに追加するだけである。

Configuration Settings File.png

スクリーンショット 2017-08-08 16.24.19.png

雛形はコメント以外何も書かれていない状態となっているので、これに記述例などを参考に漢らしく手書きで書いていくか、XcodeのBuild Settingsの項目自体をエディタにドラッグアンドドロップ(またはcmd+c/vでコピペ)して、貴方好みの設定値に変更していくのだ。

「ドラッグ」する項目(例: Info.plist files)
スクリーンショット 2017-08-08 16.33.57.png

「…アンドドロップ」したエディタの状態。
スクリーンショット 2017-08-08 16.33.39.png

最後に、Xcodeの[対象プロジェクト]-ConfigurationsでConfiguration(Debug/Release等)ごとにxcconfigを割り当てる事で有効になる。

スクリーンショット 2017-08-08 16.55.36.png

図は、「HybridModel」ターゲットのDebug/Release両方に「massprotest03(.xcconfig)」を割り当てた例。

記述例

※ ここから先はAutomatically manage signingとxcconigで超効率化を読んだ前提で記述します。

比較がしやすいよう、パターン1と2を用意した。

まず、パターン1を見て欲しい。Automatically manage signingを利用しない場合は、7項目の割り当てをdebug、releaseそれぞれに割り当てる必要がある。
次にパターン2、Automatically manage signingを利用した例。
上記とほぼ同様の設定を半分以下(3項目)かつdebug、release共通で実現しており、管理も非常にシンプルとなる。

パターン1: 手動割り当て例(Automatically manage signing 利用なし)

Config.debug.xcconfig
//
//  Config.debug.xcconfig
//  HybridDemoSwift
//

// バンドルID
PRODUCT_BUNDLE_IDENTIFIER = hoge.hoge.hogehoge

// プロダクト名/表示名
PRODUCT_NAME = アプリ名称

// 開発チームID
DEVELOPMENT_TEAM = XXXXXXXXXX

// プロビジョニングプロファイル設定
PROVISIONING_PROFILE_SPECIFIER = hoge-dev
PROVISIONING_PROFILE = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

// プロビジョニング向け証明書
CODE_SIGN_IDENTITY[sdk=iphoneos*] = iPhone Developer: hoge hoge (XXXXXXXXXX)

// アイコンasset
ASSETCATALOG_COMPILER_APPICON_NAME = hoge-AppIcon
Config.release.xcconfig
//
//  Config.release.xcconfig
//  HybridDemoSwift
//

// バンドルID
PRODUCT_BUNDLE_IDENTIFIER = hoge.hoge.hogehoge

// プロダクト名/表示名
PRODUCT_NAME = アプリ名称

// 開発チームID
DEVELOPMENT_TEAM = XXXXXXXXXX

// プロビジョニングプロファイル設定
PROVISIONING_PROFILE_SPECIFIER = hoge-appStore
PROVISIONING_PROFILE = yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy

// プロビジョニング向け証明書
CODE_SIGN_IDENTITY[sdk=iphoneos*] = iPhone Distribution: HOGE Co., Ltd (YYYYYYYYYY)

// アイコンasset
ASSETCATALOG_COMPILER_APPICON_NAME = hoge-AppIcon

パターン2: 自動割り当て例(Automatically manage signing 利用あり)

Config.xcconfig
//
//  Config.xcconfig
//  HybridDemoSwift
//

// バンドルID
PRODUCT_BUNDLE_IDENTIFIER = hoge.hoge.hogehoge

// プロダクト名/表示名
PRODUCT_NAME = アプリ名称

// アイコン用asset
ASSETCATALOG_COMPILER_APPICON_NAME = hoge-AppIcon

パターン1、2で共通のポイントは「PRODUCT_NAME = アプリ名称」。
これは、ターゲット設定のDisplay Nameを「$(PRODUCT_NAME)」と設定しておく事で、アプリアイコン下の文字の指定までxcconfigの記述で実現する為の仕掛けとなる。

hoge.png

※現状、xcconfig側でDisplay Nameが指定できない問題の回避策。

あとは必要な数だけxcconfigを用意しておき、ビルドする際に[対象プロジェクト]-Configurationsで切り替える事で、ターゲットを切り替えることなく、簡単にビルド設定を切り替える事が可能となるはずだ。

以上。良い旅を!

バージョン情報

Xcode:8.3.3

60
43
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
60
43