iOS 在哪里设置环境变量?

Posted

技术标签:

【中文标题】iOS 在哪里设置环境变量?【英文标题】:Where to set environmental variables in iOS? 【发布时间】:2012-07-20 17:18:30 【问题描述】:

在我的开发中,我希望在测试时点击开发 URL,但是当应用程序在我的 iPhone 上运行时,我希望它在生产 URL 上运行。如何在 Xcode 中进行设置?

似乎我需要能够设置环境变量(在这种情况下是不同的 URL)。

我在哪里设置这些?由于我是新手,请握住我的答案

谢谢

【问题讨论】:

这里有几种不同的方法:qualitycoding.org/production-url 我一般在构建配置中设置。您可以执行其他操作,例如更改显示名称/捆绑 ID(这允许在同一部手机上安装“生产”和“开发”版本,这意味着您可以大致了解安装的内容而无需打开设置视图)。 【参考方案1】:

有很多方法可以做到这一点。我首选的方法是创建一个名为 Constants.h 的文件,如下所示:

//
//  Constants.h
//

#ifndef Constants_h
#define Constants_h

#pragma mark - Instances
#ifdef DEVELOPMENT
#define ROOT_URL @"http://127.0.0.1:8000"
#endif

#ifdef STAGING
#define ROOT_URL @"http://staging.example.com"
#endif

#ifdef PRODUCTION
#define ROOT_URL @"http://production.example.com"
#endif

然后,我只是将它包含在我的 *-Prefix.pch 文件中,如下所示:

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import "Constants.h"
#endif

在您的构建设置中,设置 DEVELOPMENT、STAGING 或 PRODUCTION = 1。

现在您可以在项目中的任何位置访问 ROOT_URL 等内容。

祝你好运!

【讨论】:

召回(特别是如果您有一台速度较慢的机器和/或大型项目)对预编译头文件的更改将导致所有内容的重新编译。而这些 URL 的值应该很好地封装到一个文件中(尽管 DEVELOPMENT/STAGING/PRODUCTION 的值可能不是)。 +1 用于将其导入 Prefix.pch。共享代码时效果很好。 另外你如何设置 devleopment 或 staging 等于 true,似乎在构建设置中找不到该字段【参考方案2】:

我也更喜欢#define 方法。对于那些不太熟悉的人来说,这些是预处理器指令,甚至在编译器获取代码之前就已设置。

Environment variables是在程序运行时设置的,可以在Xcode 4.x+的scheme editor中操作。您可以设置不同的方案来满足不同的测试环境。

要在运行时从代码中访问环境变量,请使用以下命令:

NSString *url = @"http://standardurl.com";
NSDictionary *env = [[NSProcessInfo processInfo] environment];
NSString *overrideURL = [env valueForKey:@"url"];
if (overrideURL != nil)
  url = overrideURL;

【讨论】:

这是一个有用的宏,您可以添加到 Prefix.pch 文件中:#define ENVIRONMENT_VARIABLE_DEFINED(v) ([[[NSProcessInfo processInfo] environment] valueForKey:v] ? YES : NO) 这使您可以在 Xcode 的方案编辑器中添加环境变量,并使用复选框打开/关闭它们以更改您的代码在运行时。要使用此宏:if (ENVIRONMENT_VARIABLE_DEFINED(@"ENV_VAR_NAME")) ... 【参考方案3】:

如果您不想使用常量文件,还可以通过添加新的字符串行来在 plist 文件中设置不同的 URL。

(虽然我承认在这里没有什么收获,但取决于你喜欢在哪里设置你的网址)

在您的 myApp-plist 文件中添加新行,如下所示:

“DevelopmentEndpoint”“字符串”“http://development.endpoint.com”

“ProductionEndpoint”“字符串”“http://production.endpoint.com”

在您的代码中:

// Get endpoint from main bundle
#ifdef DEVELOPMENT
    NSString *endpoint = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"DevelopmentEndpoint"];
#else
    NSString *endpoint = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"ProductionEndpoint"];
#endif

在您的构建设置中,在“预处理器宏”部分下添加 DEVELOPMENT 以进行调试或发布等。

【讨论】:

@tc 非常有效的观点。我没有考虑安全性。我建议其他人听从 Erik 的建议。 充其量是一个(通过安全性)晦涩难懂的问题(开发 URL 往往很容易被猜到);将开发数据嵌入生产构建中似乎很不整洁。

以上是关于iOS 在哪里设置环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows7 设置node的环境变量NODE

如何在Windows7 设置node的环境变量NODE

Windows如何设置环境变量

怎么设置用户环境变量?

windows10如何设置环境变量

Linux设置环境变量