13

さまざまなクライアント用にコンパイルする必要がある既存のアプリがあります

各クライアントには、独自のアイコンとスプラッシュ画面が必要です。
また、特定のクライアントがそれらを必要とするかどうかに応じて、さまざまな機能を条件付きで含めることができるようにしたいと思います。

クライアントごとに異なるターゲットを設定しようとしましたが、今のところあまり運がありません。
同じ名前の異なるリソースですが、異なるパスが混同され続けています。

理想的には、類似した別のクライアントを複製してアプリを作成し、最小限の変更を加えて新しいクライアント用のアプリを作成できるようにしたいと考えています。

このアプリを設定するための最良の方法は何ですか?

4

7 に答える 7

10

クライアントごとに個別のターゲットを設定することをお勧めします。機能については、最初にターゲット設定 ([ビルド] タブの [プリプロセッサ マクロ] の下) でクライアントを識別するマクロを設定し、次に次のような FeatureDefines.h ファイルを作成することをお勧めします。

#ifdef macroClientA // assume client A wants features 1 and 3
#  define macroFeature1
#  define macroFeature3
#endif

// and similarly for the other clients

今、あなたは使用することができます

#import featureDefines
#ifdef macroFeature1

機能 1 が必要かどうかをテストする必要がある場所。

個別のアイコンについては、ターゲット設定でクライアントごとに異なる info.plist ファイルを指定でき、それらのファイルはアイコンに別のファイル名を指定できます。

個別のスプラッシュ スクリーンの場合、iOS では常にスプラッシュ スクリーンに Default.png という名前を付ける必要がありますが、プロジェクト ディレクトリの別のサブディレクトリに入れることができます。Xcode で「グループとファイル」と表示されている場所を右クリックし、[ターゲット メンバーシップ] を選択してから、使用するもののチェックボックスをオンにし、他のものをオフにすることで、どのターゲットにどれを使用するかを制御できます。

リソースについては、次のようにリソース ファイルに名前を付けることをお勧めします。

resourceName.ext // クライアント固有のリソースがない場合に使用される汎用リソース
resourceName-clientName.ext // クライアント固有のリソース

次に、次のような一般的なリソース ファインダー メソッドを設定します。

-(NSString *) resourcePathForResourceName: (NSString *) resourceName extension: (NSString *) ext {
  NSString *clientName;
  #ifdef macroClientA
     clientName = @"clientA";
  #endif // and similarly for the other clients
  NSString *clientSpecificName = [NSString stringWithFormat: @"%@-%@.%@", resourceName, clientName, ext];
  NSString *genericName = [NSString stringWithFormat: @"%@.%@"];
  if ([[NSFileManager defaultManager] fileExistsAtPath: clientSpecificName])
     return clientSpecificName;
  else if ([[NSFileManager defaultManager] fileExistsAtPath: genericName])
     return genericName;
  else
    // handle the error
}

そのメソッドを使用してすべてのリソース ファイル グラブを実行すると、コードを 1 行も変更することなく、クライアント固有のリソースをプロジェクトに追加できます。

于 2010-12-28T03:00:06.950 に答える
7

同様のシナリオがあり、それを処理する方法は次のとおりです。

1) アプリのコア コードは「application_name-base」フォルダーに保持されます

2) 異なるクライアントが「application_name-client_name」フォルダーにある

3) プロジェクト ファイルはクライアント フォルダーにあり、コピーを使用せずにベース フォルダーからの参照が含まれます。

4) クライアントのプロジェクトに固有である必要があるファイルは、client フォルダーにあります。通常、同じ名前を使用した画像。または個々のプロジェクトに固有である必要がある .h .m ファイル。プロジェクトごとにファイルを含めないようにすることもできます。

コードを中心に保ちながら、混乱を招くことなくクライアントごとに異なるコードを許可します。

于 2010-12-21T23:06:11.583 に答える
3

クライアントごとに個別のターゲットを作成し、各クライアントのアセットを同じ名前の独自のフォルダーに配置できます。共通点が多く、各プロジェクトから適切なアセットを追加/削除しただけの 2 つのプロジェクトがある場合に、同様のことを行いました。

あなたのシナリオでは、その時点で、クライアント固有のリソースを含む新しいフォルダーを各ターゲットに追加するだけでよく、コードを変更する必要はありません。パスが問題になる場合は[UIImage imageNamed:]、完全なパスを必要とせず、ファイル名だけを必要とする方法を使用することを検討できます。

于 2010-12-21T23:03:55.523 に答える
1

そのような業務に XCode を使用する代わりに、いくつかの自動化ツール/スクリプトを作成したいと思います。

http://developer.apple.com/tools/xcode/automatorforxcode.html

于 2010-12-30T08:07:27.937 に答える
0

顧客ごとにプロジェクトを作成し、プロジェクト ディレクトリにコピーすることなく、同じパスからすべてのソースを含めることができます。したがって、同じコードベースを使用しながら、プロジェクト内のアイコン/スプラッシュ スクリーンを置き換えることができます。これは、これまでで最も簡単な方法のようです。

于 2010-12-28T13:10:05.053 に答える
0

外部構成ファイルがセットアップの大部分を実行できるようにコードを記述してから、ターゲットに正しいアセットを含めます。クライアントごとに新しいターゲットを持つ 1 つのプロジェクトがあるため、各ターゲットに含めるアセットを選択できます。複数のターゲットに問題がある場合は、git を使用してコア プロジェクトを管理し、クライアントごとにブランチします。

于 2010-12-21T23:03:56.870 に答える
0

クライアントが入り、会社/個人のニーズに合わせてアプリをカスタマイズするための設定インターフェイスを作成するだけです。たとえば、フォト ライブラリなどから画像を提供します。

于 2010-12-23T23:22:10.857 に答える