1

一連の異なるオブジェクトに対して一連の複雑な構成が必要であるとします。この構成は、サービスのサーバーアドレスのようなNSString、タイムアウト時間のようなNSNumberなどにすることができます。次の制約を課したい:

  • 構成はユーザーに表示および/または編集可能であってはならないため、アプリバンドルのplistは許容できるソリューションではありません
  • デバッグ、アドホック、またはリリースターゲットに異なる構成値が必要です(一連の#ifdefでこれを達成する可能性がありますが、完全性のために記述します)
  • 構成したいすべてのオブジェクトは静的ライブラリに属し、この静的ライブラリを使用するコードから構成を注入したい(注入は依存性注入への個人的なヒントとしてイタリック体で示されています)

私の質問は:これを達成するための最良の方法は何ですか?このような問題に直面したことがありますか?どのようにそれを解決しましたか?

4

6 に答える 6

2

Xcodeビルドシステムを利用します。任意のビルド構成(デバッグ、リリースなど)およびターゲットの組み合わせ用のXcode構成ファイルを作成できます。

これらのファイルは、共有構成を簡素化するための継承をサポートしています。オプションを定義する単一の方法はありません。簡単な方法は、コンパイラが使用するものを使用することですGCC_PREPROCESSOR_DEFINITIONSCFLAGS

TargetX.xcconfig

GCC_PREPROCESSOR_DEFINITIONS = STAGE=2 SERVER_URL='www.wuonm.com'

NSString構成された値を使用して、必要なオブジェクトまたはオブジェクトを作成するのは非常に簡単NSNumberです。ヒント:ある種の文字列化が必要になります。

使用するのと非常に似ていますが、ファイルの動作を理解する#defineために時間を費やすと、IMHOの方がはるかにクリーンで構造化されています。xcconfig

于 2012-06-01T09:35:52.073 に答える
0

この投稿で発生する多くの質問があります:

  1. 入力構成にこのレベルの保護が必要なのはなぜですか?
  2. ユーザーが構成を変更できるようにしたくないのはポイントですか、それともユーザーがそれをまったく知らないようにしたくないのですか?
  3. SWがSWを保護できないという理論を信じるなら、ハッカーがSWをハッキングしたくない十分な痛みをハッカーに与えるために、本当にどの程度の痛みを乗り越えても構わないと思っていますか(それに直面することができるので、それだけです)本当に取得するつもりです、暗号化についての上記の私のコメントを参照してください)
  4. インターネットから構成を取得することにある程度同意しますが、これは、アプリを使用するためにインターネット機能が存在することを期待している場合にのみ機能します。これを行い、ある程度の保護も必要な場合は、ダウンロードに安全なプロトコル(SSLなど)を使用する必要があります。
  5. アプリをローカルで(インターネットにアクセスせずに)使用できるようにしたい場合は、OSを制御せず、SWが実行されているHWを制御しないため、構成の真のセキュリティは単純に不可能です。 、など..。
  6. アプリをiPhoneに置くということは、おそらくかなりの量のダウンロードを望んでいることを意味します。これは、それに触れて、潜在的にそれにクラックをかけることができる手の量も多いことを意味します。この場合(実際にはSWがないため)、セキュリティを確保する唯一の方法は、それをハッキングすることの価値を高めて、構成をそれほど価値のないものにすることです。値が低い場合、ハッカーはそれをクラックしようとはしません!
于 2012-05-30T15:59:58.590 に答える
0

静的ライブラリは、実行時に設定される現在の構成を設定するためのインターフェイスを提供する必要があります。

SetCurrentConfiguration(Configuration config);

次に、「クライアント」は実行時に必要な構成で構成できます。2番目のステップは、指定されたソース、たとえばxmlファイルから構成をロードし、上記の方法で静的ライブラリに挿入することです。

ユーザーに構成ファイルを変更させたくない場合は、ある種の暗号化を使用して、その場で復号化することができます。

于 2012-05-31T15:47:07.913 に答える
0

これらの値がビルド構成ごとに定数である場合は、コードに定数として入れてみませんか?これらの設定が構成によって異なる定数である場合、なぜこれらの設定を外部化する必要があるのか​​、私にはよくわかりません。設定のifdef選択は、プライベートヘッダーで宣言されたこれらの定数と同じくらい効果的(かつ高速)になります。

これらの設定がアプリの実行中に何らかの形で変更された場合(ビルドごとではなく、アプリの単一ビルドの実行の範囲内で)、これらの設定を外部化することが適切です。

于 2012-05-25T14:16:52.693 に答える
0

さまざまなクラスで使用されるサーバーURLと、色、サイズ、ほとんどすべての構成などの定数を簡単に変更する必要があるという同じ問題に直面しました。私が見つけた最善の解決策は、Constants.hのようなヘッダーファイルを作成することでした。このヘッダーファイルの内容は次のとおりです。

#define MAX_DIST 1000
#define MIN_DIST 300
#define ANIMATION_DURATION 0.010
#define PIXEL_MOVES 7
#define SENSITIVITY 14
#define VIEW_ANGLE 30 //Range of vision divided by 2
#define RAD_POS_X 415
#define RAD_POS_Y 15
#define BUTTON_VIEW_WIDTH PIXEL_MOVES*360
#define SCREEN_HEIGHT 480
#define BUTTON_WIDTH_CLOSE 180
#define BUTTON_HEIGHT_CLOSE 100
#define BUTTON_WIDTH_MEDIUM 100
#define BUTTON_HEIGHT_MEDIUM 60
#define BUTTON_WIDTH_FAR 60
#define BUTTON_HEIGHT_FAR 40
#define BUTTON_Y_POSITION_CLOSE 200
#define BUTTON_Y_POSITION_MEDIUM 135
#define BUTTON_Y_POSITION_FAR 90
#define SERVICE_URL @"http://my.server.com/SoapServer/SoapServiceWS"//

次のような一般的な関数を定義することもできます

#define DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__) / 180.0 * M_PI)

このようにして、1つのファイルからアプリのあらゆる側面を構成することができ、さまざまなコンパイルを管理するために言ったように#ifdefを使用できます。もちろん、これらの定数のいずれかにアクセスする必要があるクラスには、Constants.hファイルをインポートする必要があります。

于 2012-05-30T16:18:37.963 に答える
0

初めて使用する場合は、インターネット接続が存在し、HTTPSを介して構成をダウンロードし、メモリに保持する必要があります(必要に応じて暗号化されます)。

次に、iOSのキーチェーンを利用して、構成を文字列としてそこに保存します(基本的にはシリアル化します)。

NSString *serializedConfig = ...;
[keychain setObject:serializedConfig  forKey@"MyConfig"];

その後の使用時に、キーチェーンに保存されている構成を取得します。

NSString *serializedConfig = [keychain objectForKey:@"MyConfig"];

キーチェーンラッパーとドキュメントは、AppleDocsサイトにあります。

于 2012-06-01T11:39:42.880 に答える