10

さまざまな顧客向けにさまざまなビルドを持つ汎用アプリを作成しています。アプリは各顧客に対して 99.5% 同一であり、それぞれの違いは、顧客固有の画像、テキスト、アプリ アイコンなどでブランド化されていることです。

明らかに、これは次のようなフラグを使用して実行できます。

#if defined (CUSTOMER_A)
    NSString* text = @"Text for customer A";
    UIImage *image = [UIImage imageNamed:@"customerAImage"];
#elseif defined (CUSTOMER_B)
    NSString* text = @"Text for customer B";
    UIImage *image = [UIImage imageNamed:@"customerBImage"];

しかし、明らかに私はこれを避けたいと思っています:

   NSString* text = @"Text";
   UIImage *image = [UIImage imageNamed:@"image"];

(テキストはローカライズ可能であるため、最終バージョンでは NSLocalizedString を使用します)。

プロジェクトを多数の静的ライブラリと共にワークスペースに配置する方法が考えられるのではないかと考えていました。それぞれのライブラリには顧客ごとに特定のテキストと画像が含まれており、さまざまなスキームを使用してさまざまなビルドを作成します。したがって、スキーム A は、たとえばメイン プロジェクトと静的ライブラリ A でビルドされたターゲットを作成します。

私は小さな概念実証から始めましたが、先に進む前に、これが実現可能で合理的なアプローチであるか、またはより良い代替手段があるかどうかを確認したいと思います。実行可能である場合、いくつかの疑問が頭に浮かびます。

  • メイン プロジェクトのコードから静的ライブラリの画像にアクセスするにはどうすればよいですか? ライブラリのコンテンツにアクセスするには、バンドルを作成する必要がありますか?これはどのように行われますか?

  • 使用されているスキームに応じて、アプリケーションのデスクトップとマーケットプレイスのアイコンを変更することはできますか?

  • スキームごとに使用する配布証明書などの異なるセットを指定することは可能ですか?

  • 静的ライブラリにローカライズされたバリアントを含めることができないというのは本当ですか?

これは iOS 用であるため、フレームワークを使用することはできません。

フィードバックをお寄せいただきありがとうございます。

(PS ビルド システムは Jenkins を使用して自動化されます)。

4

5 に答える 5

9

プロジェクトに複数のターゲットを作成し、ターゲット (顧客/ブランド) ごとにリソース フォルダーを用意するだけです。これを実現する方法は次のとおりです。

  1. 2 つの新しいリソース フォルダを作成します。Resources_Customer1 b. リソース_顧客2
  2. 適切なリソースをそれぞれのフォルダーにコピーします
  3. プロジェクトを選択 - >ターゲット
  4. ターゲットを複製する

  5. [Copy Build Resources] のリソース名をカスタマイズして、適切な顧客/ブランドを指すようにします
  6. 選択したターゲットに基づいて、適切なターゲットの実行をテストおよび検証します。

お役に立てれば!

于 2012-07-31T23:05:04.537 に答える
6

いくつのバリアントをサポートする予定ですか? 一握り以上ある場合、ターゲット/プロジェクト/などを持つことは扱いにくくなります。これは大まかに私たちがしていることです:

  • Jenkins はソース管理を監視し、確認された新しいコミットを構築します。
  • Jenkins は出力 .app を「スキン」のコレクションとともにアーカイブします
  • 自作の Web サイトは Jenkins API にフックし、(ブランチ、スキン) のすべての順列を一覧表示します。
  • 「ユーザー」が (ブランチ、スキン) を選択すると、自家製のサイトがスクリプトを呼び出してスキンを .app バンドルに「適用」し、署名して .ipa にパッケージ化し、ユーザーのデバイスにインストールします。

スキン「アプリケーション」プロセスは、基本的に「スキン」ディレクトリのリストを提供することで構成されます。これらのファイルは、アプリケーション バンドルにコピーされます。重複ファイルはスキンによって上書きされます。アプリケーションのベースInfo.plistは、スキン ディレクトリで指定されたすべての変更とマージされます。

基本的に、コード自体から可能な限りスキニングを分離しようとします。Xcode 自体を含むソリューションには、開発者の頭皮から手作業で髪を取り除く作業が多く含まれていることがわかりました。

于 2012-07-31T23:23:12.653 に答える
3

現在の雇用主では、@SedateAlien の回答に部分的に触発されたポストビルド プロセスを約 3 年間適用してきました。

公園を散歩するようなものではありませんが、最終的にすべてが適切に機能するようになると、時間を大幅に節約できるだけでなく、プロジェクトをクリーンでシンプルに保つことができます。

私たちが取った高レベルのアプローチは次のとおりです。

  1. プロトタイプとして機能する単一のターゲット (つまり、単一のブランドまたは「スキンなし」のバリアント) を使用して、アプリ プロジェクトを設計および構築します。このターゲットに対してほとんどの開発を実行するため、完全に使用できる十分な基本リソースがあることを確認してください。
  2. さまざまなブランド資産を保持するために、どこかに「ブランド リソース」リポジトリを設定します。各ブランドのディレクトリで「brand.config」ファイルを使用します。このファイルには、アプリ名、バンドル ID などのさまざまなブランド固有の情報と、バンドルにスワップされるさまざまな既知のリソース ファイルが含まれています。
  3. ビルド サーバー (Jenkins を使用) またはシェル スクリプトをセットアップして、ビルドされたプロトタイプ .app に基づいてブランディング プロセスを実行します。ブランド プロセスは次のように機能します。

  4. プロトタイプ .app バンドル全体を新しいディレクトリにコピーし、コード署名をすべて削除します。

  5. Plistbuddy を使用して、brand.config のパラメーターに基づいてバンドルの plist を変更します。
  6. バンドル内の既知のリソース (画像など) を、ブランドのリソース ディレクトリのリソースと交換します。
  7. アプリの実行可能ファイルをコード設計し、バンドルして .ipa に圧縮します。

最も厄介な部分は、間違いなくコード署名です。おそらく資格ファイルを使用する必要があり、証明書が正しく識別され、ビルド マシンにインストールされていることも確認する必要があります。

問題が発生した場合でも、あきらめないでください。約束します!コメントで人々が抱えている特定の問題を解決しようとしますが、これを積極的に開発してからしばらく経っていることを理解してください。

また、このプロセスに関して App Store への申請で問題が発生したことはなく、多数のアプリを申請しています (更新ごとに 100 以上)。

于 2016-04-25T22:25:07.447 に答える
1

私は会社のためにまったく同じことをしたので、私がそれをどのようにしたかをあなたと共有することができます。私はXcodeを使用していたので、Jenkinsと言うまで一緒にいましたが、おそらくあなたはそれを機能させることができます。

基本的に、「スキン」アプリケーションプロジェクトに含まれる1つのライブラリプロジェクトを作成します。スキンには、アプリ固有の画像、plist、および場合によってはいくつかのメソッドが含まれます。オブジェクト、関数、またはグローバルを販売する1つのクラスを使用して、フレームワークで使用される.hファイルを作成します。このファイルのヘッダーは、ライブラリをビルドできるようにライブラリに含まれています。

たとえば、「extern UIImage * mainBackgroundImage;」があり、ライブラリでそれを参照しているとします(つまり、表示用に取得します)。

もちろん、「スキン」アプリケーションには、.hファイルで約束したすべての公開アイテムを解決するための.m(または.c)ファイルがあります。

Xcodeでは、ライブラリプロジェクトを作成します。これをすべての「スキン」プロジェクトに含めます([ビルドフェーズ]ペインでライブラリへの依存関係を取得し、ライブラリがリンクフェーズに含まれていることを確認する必要があることに注意してください。ライブラリでカテゴリを使用する場合は、各ターゲットのプロジェクトのリンクフラグに特別な行を追加して、ライブラリをforce_loadします。

30分で、2つのプロジェクトを使用して小さなテストハーネスを作成し、これが問題なく機能することを確認できます。

于 2012-07-31T23:02:36.423 に答える