web-dev-qa-db-ja.com

Xcodeでランタイム設定の独立したセットを構成する方法

私のiPhoneアプリケーションは、3つの異なるサーバーに接続します。たとえば、productionstaging、およびtestingです。接続するサーバーに応じて、アプリケーションが使用する設定値の束があります。 FacebookアプリID、TestFlightチームキーなど.

GITですべての設定を行い、コンパイルまたはリリース時にアプリケーションが使用するはずの構成のみを選択したいと思います。たとえば、テストが選択されている場合、XcodeのProduct-> Runは、接続しているアプリのデバッグバージョンを実行します- testing、およびProduct-> Archiveは、testingにも接続するリリースバージョンでIPAファイルを作成します。

デバッグとリリースよりも多くのビルド構成を作成したくありません(ビルド構成/ランタイム構成の6つの異なる組み合わせを意味するため)。私が見ているように、理想的な解決策は、3つのスキーム:productiontesting、およびstagingであり、各スキ​​ームはアプリケーションで使用する3つのInfo.plistファイル。これにより、異なる実行時設定だけでなく、バ​​ックエンドサーバーに応じて異なるアプリケーションバージョンまたはバンドル識別子を定義することができます。しかし、別のビルド構成を選択する以外の方法でアーカイブアクションを構成できるようには見えません。それが何らかの方法で達成できるとしたら、何かアイデアはありますか?

編集:わかりやすくするために、production/staging/testingはiOSアプリケーションのバージョンではなく、バックエンドサーバーです。 iOSアプリには、2つのバージョンがあります:debug/release。言い換えれば、debugproductionサーバーに接続するアプリケーションのバージョンを実行して、たとえばそのサーバーから返されたJSONによって引き起こされるクラッシュをデバッグすることができます。わかりやすくするために、サーバーにA、B、Cという名前を付けることもできます。

57
Greg

環境ごとに異なるビルドターゲットを使用することをお勧めします。前にこのモデルを正常に使用しました。プロジェクトの設定で、現在のターゲットを複製し、必要に応じてビルド設定を変更できます。そのターゲットのデフォルトplistを変更できるInfo.plist Fileプロパティがあります。

その後、対応するターゲットを使用する環境ごとにスキームを作成できます。

さらに一歩進んで、ターゲットごとに異なるバンドルIDと異なる名前を使用できます。これにより、たとえば、同じデバイスにステージングビルドとプロダクションビルドの両方をインストールできます。

これの唯一の欠点は、プロビジョニングプロファイルを更新するときに作業が増えることです。

10
adig

これを行う良い方法は、ビルド構成とCマクロを使用することです。これにより、構成ごとに個別のターゲットを作成する必要がなくなります。これは実際にはターゲットの正しい使用方法ではありません。

まず、プロジェクトレベルで構成をセットアップします。

enter image description here

デバッグ、エンタープライズ配布、およびその他のタイプの特別なビルド用にさまざまな構成を作成できます。

次に、コンパイラーに渡される構成ごとにいくつかのマクロフラグを定義できます。その後、コンパイル時にこれらのフラグを確認できます。ターゲットレベルで「プリプロセッサフ​​ラグ」ビルド設定を見つけます。

enter image description here

三角形を展開すると、構成ごとに異なる値を定義できます。ここでKEY=VALUEまたはKEYマクロのみを定義できます。

enter image description here

コード内で、これらのマクロの存在または値(存在する場合)を確認できます。例えば:

#ifdef DISABLE_FEATURE_X
    featureXButton.hidden = YES;
#endif

// ...

#if FOOBAR_VISIBLE == 0
    foobarView.hidden = YES;
#Elif FOOBAR_VISIBLE == 1
    foorbarView.hidden = NO;
#else
    #error Invalid value for FOOBAR_VISIBLE
#endif

文字列値を渡すこともできます。ビルド設定では、単一引用符で囲む必要があります。 DEFAULT_LOCALIZATION_NAME='@"en"'

スキームエディターを使用して、デバッグおよびアーカイブ時にどの構成を使用するかを構成することもできます。スキームエディターで[実行]または[アーカイブ]を選択した場合は、適切な構成を選択できます。

enter image description here

Info.plistファイルのエントリをパラメータ化する必要がある場合、カスタムビルド設定を使用して値を定義できます。ターゲットのカスタムビルド設定を追加します。

enter image description here

次に、さまざまな構成に適切な値を指定します。

enter image description here

次に、Info.plistファイルでこの設定を参照できます。

enter image description here

このアプローチの1つの制限は、次の項目を変更できないことです。

  • Settings.bundle

さらに、資産カタログをサポートしない古いバージョンのXcodeでは、次の項目を変更できません。

  • Icon.png
  • Default.png

これらをInfo.plistファイルまたは他の場所で明示的に定義することはできません。つまり、変更するには異なるターゲットが必要です。

お役に立てれば。

112
Mike Weller

関係するライブラリがコードでキーを設定できる場合、これははるかに簡単なソリューションです。つまり、plistファイルで製品値を保持できますが、AppDelegate(または最初に使用されるファイル)で変更できます。

現在、facebook、Twitter、google sdkで動作します。

例:

#ifdef DEBUG
  // Facebook
  [FBSettings setDefaultAppID:@"SandboxID"];
  // Fabric / TwitterKit - must be called above [Fabric with:@[TwitterKit]];
  [[Twitter sharedInstance] startWithConsumerKey:@"SandboxKey" consumerSecret:@"SandboxIDSecret"];
#endif

Swiftと同じで、#ifdefの代わりに#ifを使用します。

Facebookに関する注意これはSDKのバージョン3で機能しましたが、それ以降のバージョンで可能かどうかはわかりません。

2
Nycen

おそらく非常にローテクですが、必要なAPIのURLを返すapiURL()というメソッドがあります。ローカルホスト、ステージ、およびプロダクションがあり、必要なもののコメントを外します。これまでのところ私にとってはうまくいきました。数回戻すことを忘れました。おっとっと。

0
Dan