在Xcode中创建一个动态的预处理宏

3
我经常在iOS项目中与开发服务器一起工作,该服务器始终在我用来构建应用程序的同一台机器上运行。典型情况是我有一个运行在`http://localhost:3000`上的rails应用程序,并且我正在测试设备。为了在设备上进行测试,我需要一个解析后的IP地址,以便我的应用程序可以在本地网络上与我的开发服务器通信。
我知道可以使用`GCC_PREPROCESSOR_DEFINITIONS`将一些环境变量设置成预处理宏,而且我知道可以通过在bash脚本中运行`ifconfig | grep -E 'inet.[0-9]' | grep -v '127.0.0.1' | awk '{ print $2}'`来获取构建机器的IP地址。
我想做的是使用像`'@“http://${BUILD_MACHINE_IP_ADDRESS}:3000”'`这样的值在`GCC_PREPROCESSOR_DEFINITIONS`中定义`MY_SERVER_URL`,但我无法弄清楚如何使用上面的`ifconfig`脚本设置`${BUILD_MACHINE_IP_ADDRESS}`。
我考虑过使用运行脚本构建阶段编辑配置文件,但是这样更改的影响很烦人。例如,我不想将文件包括在源代码控制中,因为我的IP地址经常更改,这会导致冲突。但我需要将其包含在项目文件中,以便应用程序可以访问它。这将导致构建项目所必需但不包含在源代码控制中的文件,这很棘手。
我还尝试在运行脚本构建阶段中运行`export BUILD_MACHINE_IP_ADDRESS=`ifconfig | grep -E 'inet.[0-9]' | grep -v '127.0.0.1' | awk '{ print $2}`,但这并没有产生结果。

这样怎么样 - BUILD_MACHINE_IP_ADDRESS=$(ifconfig | grep -E 'inet.[0-9]' | grep -v '127.0.0.1' | awk '{ print $2}') - jaypal singh
@Jaypal 是的,那就是我想做的,但我不知道在哪里做这件事才能使变量在编译时可用。 - Ell Neal
你可以在命令行上使用 export 命令导出该变量,或者将其添加到你的配置文件中,以便每次打开终端时都可以全局访问。 - jaypal singh
1个回答

1
一种做法是通过运行脚本构建阶段,编写一个.h文件,并在其中用#define定义宏,然后将其包含在你的源代码中。
我不认为在构建过程中编写.xcconfig文件会对该构建产生任何影响。
从运行脚本构建阶段导出环境变量不起作用,原因有多个。首先,环境变量可以由构建设置创建,但反过来不行。其次,即使可以,子进程也无法在其父进程中设置环境变量。
另一种完全不同的方法是,您是否考虑过使用开发机器的.local主机名而不是数字IP地址?检查系统偏好设置的共享窗格,它将向您显示系统的域名。

当我在问题中提到配置文件时,我更多地考虑的是 .json 或 .plist 文件,我可能应该更加具体。对于只有我自己工作的项目,使用机器的 .local 名称可以起作用,但是一旦引入团队(每个人都有自己的开发服务器),这种方法就行不通了。我想没有理想的方法来解决这个问题,我可能会选择 .h 文件。谢谢 :) - Ell Neal
使用开发机的本地主机名而不是数字IP地址。 - Joshua C. Lerner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接