0

仲間のコーダー...

  • アプリケーションのグローバル定数ファイルにサーバーのURLを設定しています。
  • また、アプリケーションのplistに「DebugMode」という変数があります。この変数を切り替えると、アプリケーションが使用するURLが変更されます。

Constants.h
extern NSString * const LOGIN_URL;

Constants.m
NSString * const LOGIN_URL = @ " http://www.url.com ";

とにかく、以下の疑似コードをObjectiveCに複製できますか?

if([[[[NSBundle mainBundle] infoDictionary] objectForKey:@"DebugMode"] boolValue] == NO)
{
  NSString * const LOGIN_URL = @"http://www.production-url.com";
}
else
{
  NSString * const LOGIN_URL = @"http://www.qa-url.com";
}
4

2 に答える 2

4

あなたが求めることは正確には不可能です(少なくともあなたが求める方法では)。定数はコンパイル中に設定および確立され(厳密には真実ではありませんが、この説明のためにそうなります)、したがって、実行時に何らかの理由で変更できないことを意味します。

デバッグコードとリリースコードに応じて定数の値を変更する従来の方法は、プリプロセッサを使用することです。そのようです:

#if __DEBUG_MODE__ == 1
    NSString * const LOGIN_URL = @"http://www.qa-url.com";
#else
    NSString * const LOGIN_URL = @"http://www.production-url.com";
#endif

__DEBUG_MODE__何かを実行する前に定義する必要があります。これを実行する方法はいくつかあります。プレフィックスヘッダーファイル(.pch)に次の行を追加できます

#define __DEBUG_MODE__ 1  // Change to 0 to disable debug mode.

-M__DEBUG_MODE__=1または、実行するファイルにコンパイラフラグを追加します。これは__DEBUG_MODE__、値が1に設定されている場合は常に、コンパイラーがデバッグ定数を使用し、値が0の場合、コンパイラーは実動定数を使用することを意味します。

これには、デバッグコードと本番コードを分離しておくという利点もあります(問題とセキュリティの問題の世界全体を開く可能性があるため、バイナリに両方を含めることは避けてください)。

お役に立てれば。

于 2013-02-08T17:16:17.847 に答える
1

このような状況が発生したときはいつでも、定数ファイルにクラスメソッドを作成しました。

+ (NSString *)loginURL {

    if([[[[NSBundle mainBundle] infoDictionary] objectForKey:@"DebugMode"] boolValue] == NO){
        return @"http://www.production-url.com";
    }
    else {
        return @"http://www.qa-url.com";
    }
}

また、loginURL文字列がメソッドを介して送信されるため、実行時の条件に依存する可能性があることをコードでより明確にします。

NSURL *loginURL = [NSURL URLWithString:[Constants loginURL]];
于 2013-02-08T17:40:22.070 に答える