0

各位码农...

  • 我在应用程序的全局常量文件中设置了服务器 url 。
  • 我的应用程序 plist 中还有一个名为“DebugMode”的变量,一旦切换,它应该会更改应用程序将使用的 url。

常量
.h extern NSString * const LOGIN_URL;

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

无论如何,我可以将下面的伪代码复制到 Objective C 中吗?

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 回答