Help us understand the problem. What is going on with this article?

Xcodeで本番アプリと開発アプリをわけるベストプラクティス

More than 1 year has passed since last update.

はじめに

Xcodeでアプリを作る際、本番用アプリだけでなく開発用アプリも作ることがよくあると思います。
Xcodeでアプリをわける方法について記載します。(実際にこうやってるのを見たという紹介です)

開発環境

Xcode 10.2.1

Swift 5.0

要件

下記のような要件で本番、開発、ダミーの3つのアプリにわけます。

  1. 本番、開発、ダミーで別々のアプリにわけたい(bundle idをわけたい)
  2. 本番、開発、ダミーで接続先サーバをわけたい
  3. 本番、開発、ダミーでアプリ名をわけたい
  4. 本番、開発、ダミーでアプリアイコンをわけたい

※ 2.は本番→本番用サーバ、開発→開発用サーバ、ダミー→サーバ接続せずローカルのファイルを読み込むのような想定です。

完成図

t_app

方法

「やめて...」「べつにいいけど...」「おすすめ」の3つの方法を記載します。おすすめは最後のわけ方です。

やめて...

1つ目はGitのブランチでわける方法です。

Xcodeでわける方法といいつつこれはXcodeの機能を使いません。

手順

  1. gitのブランチをmaster(本番)、develop(開発)、dummy(ダミー)の3つにわける
  2. それぞれのブランチでbundle idを設定する
  3. それぞれのブランチで接続先サーバを設定する
  4. それぞれのブランチでアプリ名を設定する
  5. それぞれのブランチでアプリアイコンを設定する

これで要件通り3つのアプリにわけることができました!!簡単ですね!!

評価

この方法はやめて...

いったいだれがそのブランチを管理するんだい??今後環境が増えたらその都度ブランチを増やすのかい??

べつにいいけど...

2つ目はXcodeのTargetでわける方法です。

手順

  1. General→TARGETS→Duplicateでターゲットを複製する
    t_dup
  2. 複製したtargetの名称を変更する(PiyoApp copy→PiyoAppDev)
  3. 複製されたInfo.plistの名称を変更する(PiyoApp copy-Info.plist→InfoDev.plist)
  4. General→Identityで複製したtargetのInfo.plist(InfoDev.plist)を選択する
    t_info
  5. Generalからbundle idを変更する
  6. Generalからアプリ名を変更する
  7. Generalからアプリアイコンを変更する
  8. Manage Schemes...でスキーム名を変更する(PiyoApp copy→PiyoAppDev)
    t_manage_scheme t_scheme
  9. Build Settings→Swift Compiler - Custom Flagsにフラグを追加する(開発ならDEVELOPダミーならDUMMYなど)
    t_flag
  10. Dummyも同じように作成する
  11. それぞれの環境のサーバの接続先をコードで設定する
var serverURL: String {
        #if DEVELOP
        // 開発用URL
        return "https://piyoDev"
        #elseif DUMMY
        // ダミー用URL(ダミーはローカルのJSONファイル読み込む想定なので空文字でもOK)
        return "https://piyoDummy"
        #else
        // 本番用URL
        return "https://piyo"
        #endif
    }

多少手間がかかりましたがこれで要件通り3つのアプリにわけることができました!!

t_comp

フラグの設定場所

手順の9.のフラグの追加場所ですがBuild Settingsにはフラグを設定できる場所が下記のようにいくつかあります。

  • Apple Clang - Preprocessing → Preprocessor Macros
    → だめ。Objective-Cの遺産です。Swiftを使うならやめましょう。
  • Swift Compiler - Custom Flags → Other Swift Flags
    → だめ。ちょっと古いやつ。書き方が多少めんどくさいです。
  • Swift Compiler - Custom Flags → Active Compilation Conditions
    ココ。ここに書きましょう。

評価

この方法はべつにいいけど...

同一プロジェクトで複数アプリを作成することができましたが...引き継ぐ人たちのことも考えてほしい。

ターゲットが複数あるとあるターゲットにだけファイルを追加し忘れることが稀によくあります。クラスファイルならまだビルド実行時に気づけますが、xibファイルなどの場合はその画面を表示するまで気付くのがなかなか難しいです。

例えばPiyoViewControllerでPiyoView.xibを読み込んでいた場合「本番アプリだけPiyo画面表示したらクラッシュすんねんけど?」のような悲劇が起こります。

t_membership

おすすめ

3つ目はXcodeのConfigurationsでわける方法です。

手順

  1. Project→Info→ConfigurationsでDeugを複製する
    c_config
  2. 複製したConfigurationの名称を変更する(Debug copy→Develop)
  3. Build Settings→Swift Compiler - Custom Flagsにフラグを追加する(開発ならDEVELOPダミーならDUMMYなど)
    c_flag
  4. Build Settings→Product Bundle IdentifierでBundele idを変更する
    c_id
  5. Build Settings→Packaging→Product Nameでアプリ名を変更する
    c_product_name
  6. Build Settings→Asset Catalog Compiler - Options→Asset Catalog App Icon Set Nameでアプリアイコンを変更する
    c_icon
  7. Manage Schemes...→Duplicateでスキームを複製する
    c_scheme_dup
  8. スキームの名称を変更する(Copy of PiyoApp→PiyoAppDev)
    c_scheme_name
  9. スキームのBuild Configrationを変更する(Run以外のTestなども適宜変更する)
    c_scheme_bu c_scheme_build
  10. Dummyも同じように作成する
  11. それぞれの環境のサーバの接続先をコードで設定する
var serverURL: String {
        #if DEVELOP
        // 開発用URL
        return "https://piyoDev"
        #elseif DUMMY
        // ダミー用URL(ダミーはローカルのJSONファイル読み込む想定なので空文字でもOK)
        return "https://piyoDummy"
        #else
        // 本番用URL
        return "https://piyo"
        #endif
    }

これで要件通り3つのアプリにわけることができました!!(なぜか小さいアイコンが全部緑になったけどビルドしたらそれぞれ違うアイコンが表示されます)

c_comp

評価

この方法がおすすめ!!

不必要にブランチを増やしたり、無駄にターゲットを増やす必要もなし!!管理も楽!!これがおすすめ!!

さいごに

タイトルにベストプラクティスと書きましたが1回使ってみたかっただけです。他にこんな方法があるよとかこの方法のがいいよとかあればぜひ教えてくださいmm

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away