有没有一种方法可以在运行时找出使用的方案?
也许有更好的方法来实现这一点,我正在尝试使用方案名称设置访问环境(生产 vs 开发)。
目前,我在App-Prefix.pch
文件中使用#define ENV @"PROD"
,但是在将pkg发送给苹果进行审核时可能会错过这个信息:(
我为了寻找答案而四处搜索,因为我真的不喜欢创建额外的目标或配置集的想法。这两个选项都会导致巨大的配置同步问题。
所以,经过几个小时的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在项目中的位置进行移除。在模拟器或设备上运行应用程序时,DEBUG
变量被设置,您可以从代码中使用它:
#ifdef DEBUG
// Something
#else
// Something else
#endif
$PROJECT_DIR/
部分,使其变为:/usr/libexec/PlistBuddy -c "Set :SchemeName \"$SCHEME_NAME\"" "$INFOPLIST_FILE"
。 - JAHelia