私のiPhoneアプリケーションは、3つの異なるサーバーに接続します。たとえば、production、staging、およびtestingです。接続するサーバーに応じて、アプリケーションが使用する設定値の束があります。 FacebookアプリID、TestFlightチームキーなど.
GITですべての設定を行い、コンパイルまたはリリース時にアプリケーションが使用するはずの構成のみを選択したいと思います。たとえば、テストが選択されている場合、XcodeのProduct-> Runは、接続しているアプリのデバッグバージョンを実行します- testing、およびProduct-> Archiveは、testingにも接続するリリースバージョンでIPAファイルを作成します。
デバッグとリリースよりも多くのビルド構成を作成したくありません(ビルド構成/ランタイム構成の6つの異なる組み合わせを意味するため)。私が見ているように、理想的な解決策は、3つのスキーム:production、testing、およびstagingであり、各スキームはアプリケーションで使用する3つのInfo.plistファイル。これにより、異なる実行時設定だけでなく、バックエンドサーバーに応じて異なるアプリケーションバージョンまたはバンドル識別子を定義することができます。しかし、別のビルド構成を選択する以外の方法でアーカイブアクションを構成できるようには見えません。それが何らかの方法で達成できるとしたら、何かアイデアはありますか?
編集:わかりやすくするために、production/staging/testingはiOSアプリケーションのバージョンではなく、バックエンドサーバーです。 iOSアプリには、2つのバージョンがあります:debug/release。言い換えれば、debugproductionサーバーに接続するアプリケーションのバージョンを実行して、たとえばそのサーバーから返されたJSONによって引き起こされるクラッシュをデバッグすることができます。わかりやすくするために、サーバーにA、B、Cという名前を付けることもできます。
環境ごとに異なるビルドターゲットを使用することをお勧めします。前にこのモデルを正常に使用しました。プロジェクトの設定で、現在のターゲットを複製し、必要に応じてビルド設定を変更できます。そのターゲットのデフォルトplistを変更できるInfo.plist File
プロパティがあります。
その後、対応するターゲットを使用する環境ごとにスキームを作成できます。
さらに一歩進んで、ターゲットごとに異なるバンドルIDと異なる名前を使用できます。これにより、たとえば、同じデバイスにステージングビルドとプロダクションビルドの両方をインストールできます。
これの唯一の欠点は、プロビジョニングプロファイルを更新するときに作業が増えることです。
これを行う良い方法は、ビルド構成とCマクロを使用することです。これにより、構成ごとに個別のターゲットを作成する必要がなくなります。これは実際にはターゲットの正しい使用方法ではありません。
まず、プロジェクトレベルで構成をセットアップします。
デバッグ、エンタープライズ配布、およびその他のタイプの特別なビルド用にさまざまな構成を作成できます。
次に、コンパイラーに渡される構成ごとにいくつかのマクロフラグを定義できます。その後、コンパイル時にこれらのフラグを確認できます。ターゲットレベルで「プリプロセッサフラグ」ビルド設定を見つけます。
三角形を展開すると、構成ごとに異なる値を定義できます。ここでKEY=VALUE
またはKEY
マクロのみを定義できます。
コード内で、これらのマクロの存在または値(存在する場合)を確認できます。例えば:
#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"'
。
スキームエディターを使用して、デバッグおよびアーカイブ時にどの構成を使用するかを構成することもできます。スキームエディターで[実行]または[アーカイブ]を選択した場合は、適切な構成を選択できます。
Info.plistファイルのエントリをパラメータ化する必要がある場合、カスタムビルド設定を使用して値を定義できます。ターゲットのカスタムビルド設定を追加します。
次に、さまざまな構成に適切な値を指定します。
次に、Info.plistファイルでこの設定を参照できます。
このアプローチの1つの制限は、次の項目を変更できないことです。
さらに、資産カタログをサポートしない古いバージョンのXcodeでは、次の項目を変更できません。
これらをInfo.plistファイルまたは他の場所で明示的に定義することはできません。つまり、変更するには異なるターゲットが必要です。
お役に立てれば。
関係するライブラリがコードでキーを設定できる場合、これははるかに簡単なソリューションです。つまり、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で機能しましたが、それ以降のバージョンで可能かどうかはわかりません。
おそらく非常にローテクですが、必要なAPIのURLを返すapiURL()
というメソッドがあります。ローカルホスト、ステージ、およびプロダクションがあり、必要なもののコメントを外します。これまでのところ私にとってはうまくいきました。数回戻すことを忘れました。おっとっと。