👫

Xcode 14でひとつのプロジェクトから2つのバージョンを作る late2022

2022/11/01に公開

有料&無料や、エンジン部分が同じで2つのアプリを出すときなど、ひとつのプロジェクトから2つのバージョンを作る記録です。これにはターゲットを新たに作ります。
Xcode 14.0.1でやってみたのでそのレポートです。

前提

有料版 GetMonster
無料版 GetMonsterFree
というアプリ名とします。
まずはGetMonsterという名前でプロジェクトを作成します。
ここではiOSで、InterfaceがStoryboardで作成しました。
Bundle Identifierは、なになに.GetMonsterに設定。

プロジェクトの設定はこうなりました。

Project名
    GetMonster.project

ターゲットの設定などはこうなりました。
A = B = C
という書き方をしているところは、
設定内容はA、それはBを見に行く、それはCを見に行くという意味です。

Target名
    GetMonster

Display name(ターゲット/General)
    空白 = ${TARGET_NAME}か${PRODUCT_NAME} = GetMonster

Info.plistの場所と名前(ターゲット/Build Setting/Packaging)
    GetMonster/Info.plist

Product Bundle Identifier(ターゲット/Build Setting/Packaging)
    なになに.GetMonster

Product Name(ターゲット/Build Setting/Packaging)
    ${TARGET_NAME} = GetMonster

スキーム名
    GetMonster

ここから分割スタートです。

ターゲット複製

既存のターゲットを選択し右クリックしてDuplicate(複製)を行います。
GetMonster copyというターゲットが出来ます。
ターゲット複製により自動的にInfo.plistとスキームも2つになります。
新しいInfo.plistは一段上の場所に作られます。プロジェクトの直下です。

何が変わったか

Target名
    GetMonster copy

Display name(ターゲット/General)
    空白 = ${TARGET_NAME}か${PRODUCT_NAME} = GetMonster copy

Info.plistの場所と名前(ターゲット/Build Setting/Packaging)
    GetMonster copy-info.plist

Product Name(ターゲット/Build Setting/Packaging)
    ${TARGET_NAME} = GetMonster copy

スキーム名
    GetMonster copy

ターゲットの名前変更

ここから新しい方を編集していきます。新しくできたターゲットをGetMonsterFreeという名前にします。ターゲットを選択して直接編集します。

何が変わったか

Target名
    GetMonsterFree

Display name(ターゲット/General)
    空白 = ${TARGET_NAME}か${PRODUCT_NAME} = GetMonsterFree

Product Name(ターゲット/Build Setting/Packaging)
    ${TARGET_NAME} = GetMonsterFree

Bundle IdentifierをGetMonsterFreeに

ターゲットのSigning & Capabilitiesにある簡易設定箇所で編集します。
簡易設定箇所で編集するとBuild Setting/Packagingの値も変わります。

何が変わったか

Product Bundle Identifier(ターゲット/Build Setting/Packaging)
    なになに.GetMonsterFree

Info.plistを一つに

今のXcodeではInfo.plistの設定項目が少なく、2つある理由もなさそうなので統一することにしました。
新しくできたGetMonster copy-info.plistを消します。
新しいターゲットのInfo.plistの設定を変えます。

何が変わったか

Info.plistの場所と名前(ターゲット/Build Setting/Packaging)
    GetMonster/Info.plist

もちろんInfo.plistがそれぞれに欲しい人は、名前を変更して場所も好きなところにしてターゲットの設定にそれを書き込んで下さい。

(好みに応じて)新く出来たスキームの名前を変更

スキームの名前も変えておきます。Manage Schemesで名前を直接簡単に変更出来ます。

フラグ追加

GetMonsterFreeターゲットのBuild SettingsのOther Swift Flagsにフラグを追加
Swiftの場合、フラグは
-D FREE
と設定する必要があります。FREEのところはご自身のプロジェクトに合わせて設定して下さい。

ソース内で

#if

#else

#endif

を使って分岐させます。

Obj-Cの場合はpreprocessor macrosです。

display nameが空白の時はどこを見ているか

結論;よくわからない

そのた

Product Module NameというのもPRODUCT_NAMEに応じて変わるが、省いた。

まとめ

ターゲットを複製したら

  • ターゲット名
  • bundle identifier
  • Info.plist
  • スキーム名

を設定する

Discussion