在运行时查找Xcode Build方案名称

21

有没有一种方法可以在运行时找出使用的方案?

也许有更好的方法来实现这一点,我正在尝试使用方案名称设置访问环境(生产 vs 开发)。

目前,我在App-Prefix.pch文件中使用#define ENV @"PROD",但是在将pkg发送给苹果进行审核时可能会错过这个信息:(

2个回答

40

我为了寻找答案而四处搜索,因为我真的不喜欢创建额外的目标或配置集的想法。这两个选项都会导致巨大的配置同步问题。

所以,经过几个小时的Xcode破解,这就是我想出来的方法:

步骤1: 在你的 Info.plist 中添加键 "SchemeName",类型为字符串。

步骤2: 编辑默认方案,在构建 -> 预操作中添加一个新的运行脚本,内容如下:

/usr/libexec/PlistBuddy -c "Set :SchemeName \"$SCHEME_NAME\"" "$PROJECT_DIR/$INFOPLIST_FILE"

请确保在“提供构建设置”下选择一个目标。

步骤3:现在将该方案复制多次(管理方案…-> 选择现有方案 -> 单击齿轮图标 -> 复制)。例如,你可以创建开发、暂存、生产、应用商店等。如果希望这些方案在版本控制中被维护,请不要忘记单击“共享”。

步骤4:在代码中,您可以像这样检索值:

NSString *schemeName = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"SchemeName"];

或者用 Swift:

let schemeName = Bundle.main.infoDictionary?["SchemeName"] as? String ?? ""
现在,代码能够在运行时正确地进行配置。没有烦人的预处理器宏需要处理,也没有脆弱的配置混乱需要维护。 更新:根据下面的评论,$PROJECT_DIR可能需要根据您的Info.plist在项目中的位置进行移除。

1
这太棒了,而且很有效!我只在info.plist中设置了'SchemeName'键,当我运行构建时,该值就被设置了。我的问题是:$SCHEME_NAME从哪里来?我已经搜索了XCode环境变量的文档(和互联网),但找不到任何相关的参考资料。 - shmim
1
在我让它正常工作之前,我使用“运行脚本”命令输出了所有环境变量(Xcode在执行脚本之前设置了一堆变量)。然后我只是搜索其中的变量,直到找到一个可能的嫌疑对象。 - David K. Hess
4
太棒了,谢谢你分享这个。 - Muzammil
2
对于Swift 4.2,请使用:Bundle.main.infoDictionary?["SchemeName"] as? String ?? "" - Guilherme Carvalho
2
在 XCode 11.4 中,我必须从脚本中删除 $PROJECT_DIR/ 部分,使其变为:/usr/libexec/PlistBuddy -c "Set :SchemeName \"$SCHEME_NAME\"" "$INFOPLIST_FILE" - JAHelia
显示剩余3条评论

7

在模拟器或设备上运行应用程序时,DEBUG 变量被设置,您可以从代码中使用它:

#ifdef DEBUG
    // Something
#else
    // Something else
#endif

您可以从目标的构建设置中看到这个变量:
一旦在“运行”配置上设置了“调试”(产品->方案->编辑方案),该变量将被设置:
请参考以下截图:

是的,使用构建配置来完成这个任务可能比通过方案推断更好,因为构建配置还会影响许多其他构建设置。 - Stuart M

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