58

私のiPhoneアプリケーションは、本番ステージングテストの3つの異なるサーバーに接続します。アプリケーションが接続するサーバーに応じて使用する構成値は多数あります。たとえば、FacebookアプリID、TestFlightチームキーなどです。

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

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

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

4

4 に答える 4

112

これを行う良い方法は、ビルド構成と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つの制限は、次の項目を変更できないことです。

  • Settings.bundle

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

  • Icon.png
  • Default.png

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

お役に立てれば。

于 2012-05-08T12:09:29.553 に答える
10

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

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

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

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

于 2012-05-08T11:28:23.550 に答える
2

関連するライブラリがコードでキーを設定できる場合、これははるかに簡単な解決策です。つまり、plistファイルに本番環境の値を設定できますが、AppDelegate(または最初に使用されたファイル)でキーを変更できます。

現在、Facebook、Twitter、GoogleSDKで動作します。

元:

#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で機能しましたが、それ以降のバージョンで可能かどうかはわかりません。

于 2015-04-17T06:42:31.527 に答える
0

おそらく非常にローテクですが、必要なapiURL()APIのURLを返すというメソッドがあります。ローカルホスト、ステージ、本番環境があり、必要なもののコメントを解除するだけです。これまでのところうまくいきました。数回戻すのを忘れただけです。おっと。

于 2018-02-27T18:34:15.300 に答える