Xcode 构建设置 - 在生产构建时从 plist 中删除代码

Posted

技术标签:

【中文标题】Xcode 构建设置 - 在生产构建时从 plist 中删除代码【英文标题】:Xcode build settings - Remove code from plist on production build 【发布时间】:2015-09-24 03:26:09 【问题描述】:

在我们的项目中,我们关闭了 HTTPS 请求并将它们作为 HTTP 发送,以便针对我本地机器上的 API 进行内部测试。 为此,我将此代码添加到 info.plist

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

这允许应用通过 HTTP 请求运行。显然,这对现场环境不利,也不太可能获得应用商店的批准;所以我想在我们的生产构建目标中设置代码以自动删除这个有问题的代码,以免我们不小心把它留在里面。我已经做了一些搜索,但似乎无法在网上找到任何建议。

【问题讨论】:

【参考方案1】:

添加用户定义的构建设置,例如 ALLOWS_ARBITARARY_LOADS,然后将其值更改为 YesNo 以进行配置。然后更改 info plist 条目

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <string>$(ALLOWS_ARBITARARY_LOADS)</string>
</dict>

注意:这里NSAllowsArbitraryLoads 是作为字符串添加的,因为我们无法将布尔值或数字值 rom 构建设置添加到 plist。即使它是一个字符串,它的布尔值在运行时也会是布尔值 Yes 或 No,因为 info plist 被当作字典。Reference

【讨论】:

分配 NSAllowsArbitraryLoads 字符串值为 YES 失败,因此它似乎必须是 BOOL,因此用户定义的值似乎不起作用。你用字符串让它工作了吗? [SE 通知很烂] 不确定将字符串用于 NSAllowsArbitraryLoads 是否有效。它仅适用于用户定义的键... :(【参考方案2】:

执行此操作的最佳方法是创建当前应用目标的副本并将其命名为“MyApp PROD”,并将现有目标命名为“MyApp DEV”。现在两个目标都有自己的 .plist 文件。在“MyApp DEV”plist 文件中,您输入了开发所需的值,在“MyApp PROD”plist 文件中,您不保留生产应用程序中不需要的值。

为每个环境(如 DEV、UAT 和 PROD)使用单独的目标可为您带来其他优势,例如:

1.您可以为不同的目标设置不同的构建设置,例如代码签名证书和特定于该目标的配置文件,这样您就不必一次又一次地更改它们。

2.您可以关联特定目标所需的所需资源和实现文件。

还有更多。

【讨论】:

管理不同的目标似乎有点负担(至少只是为了这个),您可能想尝试在构建阶段使用脚本来根据配置更改设置,请检查:***.com/questions/32390228/…

以上是关于Xcode 构建设置 - 在生产构建时从 plist 中删除代码的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UIImageView 在运行时从其原始位置(界面构建器)移动?

在完成时从Azure Devops构建管道设置Git标记

如何使用Xcode的Targets来管理开发和生产版本的构建

为 beta 分发设置 xcode 配置/方案

Meteor iOS 热代码推送在 testflight 和生产中被破坏,但在本地 xcode 构建中工作

xcode 构建中的不同参数