LoginSignup
2
2

More than 3 years have passed since last update.

XcodeプロジェクトでTargetを複数つくる時に気をつける事

Last updated at Posted at 2020-07-23

経緯

あるライブラリが、シミュレータでのビルドに対応していなかった。しかしシミュレータでビルドして確かめたい点などもあるため、ターゲットを複数作り、一つはそのライブラリ有り、もう一つはライブラリ無しという形にする事にした。

やり方

Targetのコピー

  • Xcode上で「プロジェクト名.xcodeproj」ファイル(青いやつ)をクリック -> Target よりコピーしたいTarget(ここではmyProjectとする)を右クリックし、「Duplicate」を選択。「myProject copy」というTargetができる。クリックして、任意の名前に変える(ここでは、myProjectWithLibraryとする)。
    • 完全に同じ設定のtargetがコピーされている。
    • The selected target is an iPhone target. Would you like to duplicate the iPhone target and transition the new target for running on iPad?というダイアログが出てくる。意味的には、「コピー元はiPhoneがターゲットだけど、コピー先はiPad用にする?」と聞いてきている。特にそんなつもりはないため、「Duplicate only」を選択する。

Schemeの編集

  • Schemeを編集する。Targetをコピーしたのに伴って、Schemeも自動で新設されている(Xcode左上より確認できる)。ただ名前は「myProject copy」のままなので、Schemeの名前もmyProjectWithLibraryに直しておく。

Info.plist

  • TargetのコピーによりInfo.plistもコピーされている。ただ、修正し忘れなどの観点から、特に事情がなければInfo.plistは同じものを一つだけ参照した方がいいと思われる。
    • まず、自動生成されたmyProject copy-Info.plistを削除する。
    • Targets > Build Settings > Packaging > Info.plist fileより、myProject copy-Info.plistを削除し、コピー元のInfo.plistのファイル名を入力する。

Target Membership

  • Target Membershipの調整
    • 今回入れたライブラリをインポートしているファイルがTarget Membershipに入っていると、シミュレータでビルドできなくなる状況であった。そのため、それらのファイルのTarget MembershipmyProjectを外した。
    • Xcodeの左メニューから各ファイルを選択し、右メニューのFile Inspector > Target Membershipより、どのTargetに追加するかチェックボックスで選ぶことができる。
    • 以降、新規ファイルを追加する際は、myProjectmyProjectWithLibraryの両方にチェックボックスが入っていることを確認する。
    • マージなので、他の人が追加したファイルが流れてきた場合、myProjectWithLibraryにTarget Membershipがついていなかったりしたので、つけた上で、今後はつけてもらうよう周知した。

プリプロセッサマクロ

  • プリプロセッサマクロ
    • 上記Target Membershipで、ファイル毎にどのTargetで使うか決められるわけだが、それだけでは足りない場合がある。ファイル内のあるコード(例えば、今回のライブラリをインポートする部分など) を、myProjectWithLibraryの時は実行したいがmyProjectの時は実行したくなかった。そのため、プリプロセッサマクロの設定をした。
    • Targets > myProjectWithLibrary > Build Settings > Swift Compiler - Custom Flags > Other Swift Flags に、元々CocoaPodsの-D COCOAPODSが入っていたが、-D WITHLIBRARYというものを追加した。
    • マクロの使用例は以下のようになる。
AppDelegate.swift

#if WITHLIBRARY
import library
#endif

MainWireframe.swift
func presentXXXScene() {

   #if DEBUG && WITHLIBRARY 
   let vc = XXXBuilder().build()
   viewController.pushViewController(vc)
   #endif

}

Podfile

2
2
0

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
2
2