问题标签 [xcconfig]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cocoapods - 使用 Cocoapods 时如何包含我自己的 xcconfigs?
有没有办法在Cocoapods 生成的文件中指定Podfile
一个xcconfig
文件?#include
是否有用于附加此内容的公开方法/变量,#include
或者我是否需要阅读生成的xcconfig
内容并将其与附加文本一起反刍?
例如,在生成的Pods-SomeTarget.[configuration].xcconfig
中,我想看看:
ios - Xcode:从父项目继承“配置” - 不可能吗?
TL;博士
是否可以从父项目继承自定义配置?不,不是询问继承某些目标设置。
配置和预处理器宏/标志
Xcode 中的每个项目都使用名为和的两个标准配置进行初始化。使用构建设置中显示名称下的设置为目标(在此称为)设置标志是一种非常常见的模式,可以像这样从 Objective-C 代码中读取。Debug
Release
DEBUG
Preprocessor Macros
.pbxproj
GCC_PREPROCESSOR_DEFINITIONS
这也适用于 Swift,但是我们必须OTHER_SWIFT_FLAGS
像这样使用和声明它:
-D DEBUG
并像我们在上面的 Objective C 代码中那样读取变量值。
许多项目 => xcconfig 文件
我的应用程序由一个 xcworkspace 和一个主项目和几个作为依赖项的项目组成。让我们称我的应用程序依赖于框架的项目。由于我有几个框架,我不想多次设置构建设置。
因此我正在使用xcconfig
文件。我有一个主配置,即主项目的配置文件,我们称之为Main.xcconfig
. 我有另一个名为的配置文件Framework.xcconfig
,它以行开头#include "Main.xcconfig"
,因此从Main
. 当然,我设置了每个框架以使用所述Framework.xcconfig
文件。
DEBUG
当我们有这些配置文件时,声明标志非常方便,Main.xcconfig
我们添加:
从而为主项目和框架项目的配置声明DEBUG
标志(因为继承自...)。 Debug
Framework.xcconfig
Main.xcconfig
自定义配置
如果我们希望能够分析应用程序但DEBUG
设置了标志怎么办?分析应该使用与Release
. 但是我们绝对不想为构建设置DEBUG
标志。Release
为什么不创建一个新的配置,我们称之为Profiling
。问题来了!当然,我们应该为主项目创建这个新配置。然后我们编辑我们的方案和配置文件,在
构建配置下我们选择了新配置 Profiling
。
现在我们可以在文件中设置DEBUG
标志。Profiling
Main.xcconfig
我们尝试运行模拟器,我们看到“没有调试标志!” ,这是预期的,因为我们正在使用Debug
配置,因此没有声明DEBUG
标志。
所以我们尝试分析并开始一些仪器测量并打开控制台。在那里我们看到消息“DEBUG flag set”
有效,太好了!
配置不是从父项目继承的
我们刚刚检查DEBUG
了主项目中的标志。如果我们在某些框架中想要检查我们的标志会发生什么。所以我们#ifdef DEBUG
在一些框架中尝试。这行得通,因为所有框架都有配置 Debug
,因为它是所有项目的默认设置(连同Release
)。
然后我们尝试我们#ifdef DEBUG
的一个框架项目并再次开始使用 Instruments 进行分析。现在我们看到消息“没有调试标志!”
不好了!
它不工作!为什么不?!好吧,我不知道,但唯一合理的结论必须是我们作为依赖项添加的项目 - 我们的框架 -不会 从主项目继承Profiling
配置。
对我来说这是难以置信的……感觉就像 Xcode 中的一个缺陷。
糟糕的解决方案
除了将相同的配置 Profiling
添加到所有框架项目(至少对于我知道我想检查该标志的框架)之外,我不知道任何其他解决方案。但这感觉就像一个丑陋的解决方案!. 我至少有 10 个框架,不得不为每个框架添加特定配置感觉真的很难看。
替代(可怕!)解决方案
是的,当然另一种解决方案是使用Release
配置进行分析,并像这样声明DEBUG
标志Main.xcconfig
:
但是由于我们希望能够检查DEBUG
框架中的标志,我们需要添加上面的两行,Frameworks.xcconfig
同时声明标志。
当然,使用Release
配置作为方案的构建配置进行分析。
然后我们可以添加一个名为Main 项目的新配置AppStore
,并且只添加 Main 项目并将其用于归档应用程序。到目前为止,一切都很好?
这是一个陷阱!
不,这不是一个好主意!因为我刚才说了,项目和父项目之间没有继承配置。因此我们的框架不会继承这个新配置,所以当框架被构建/归档时,我已经看到它们“回退”到配置(不确定您是否可以在某处选择“默认”/“回退”配置?也许它会回退到您用作新配置基础的那个?)。AppStore
Release
但是由于我们刚刚为 Main 项目和所有框架的配置DEBUG
添加了标志声明,并且当我们归档应用程序时,它是用于我们所有框架的配置=>我们的生产应用程序将包含调试代码!. 这是非常不受欢迎的并且具有潜在危险。 Release
Release
好的解决方案?
我一个都不知道……你呢?如果从父项目继承配置不是很好吗?那将解决一切!苹果...漂亮吗?
ios - XCConfig 在 Xcode 重新启动之前不会刷新
我想要一个目标和几个编译方案,并有一些由方案的预操作脚本声明的编译器定义。
预操作脚本正在生成一个comp.xcconfig文件,该文件由 [Release|Debug]Config.xcconfig #included。
我生成的comp.xcconfig包含这一行:
我的应用程序包括以下几行:
正如预期的那样,使用上述配置进行编译会导致错误“ye”。
如果我然后将comp.xcconfig更改为:
我仍然得到'ye'。但是如果我退出 Xcode 并重新启动它,我会得到预期的“oy”。
我的问题:
有没有办法强制 Xcode 跟踪 xcconfig 文件的更改而无需退出 Xcode?
ios - XCConfig 语法
如果我有一个Adhoc.xcconfig
where 我定义了一个变量:
在运行脚本中,有一个如下所示的检查:
if 语句检查什么?我不清楚/
是特定于 bash 还是 xcconfig 的语法。同样令人困惑的是 if 语句正在使用=
not检查赋值的结果==
。
逐个分解 if 语句:
"${PREPROCESSOR_DEFINITIONS}/CRASHLYTICS=1}"
- 是一个变量扩展。/
- 这是索引更大的变量,PREPROCESSOR_DEFINTIONS
以检查变量的存在CRASHLYTICS
吗?= "$PREPROCESSOR_DEFINITIONS"
- 这只是将此字符串文字分配给先前表达式的结果吗?
任何可以阐明该语法以及 if 语句试图完成的内容的人,那将是很棒的。
ios - 强制 Xcode 8.3 使用 .xconfig 文件中的更改
我目前正在使用 .xcconfig 文件来管理 iOS 应用程序的各种构建设置,并且通常效果很好。我发现如果我只在构建之间修改 .xconfig 文件中的值,那么这些更改不会内置到应用程序中。我目前正在从宏值映射我的 info.plist 中的值。
例如,我有一个变量,如ENDPOINT_URL = someURL.com/v1
. 如果以后,我所做的唯一更改是进行修改ENDPOINT_URL = someURL.com/v2
,则值是我项目的构建设置中的更改。在我的 info.plist 中,我正在像这样映射条目EndpointURL: ${ENDPOINT_URL}
(不是精确的 plist 语法,而是一般的想法)。但是当从我的 info.plist 中读取它时,[bundle objectForInfoDictionaryKey:@"EndpointURL"]
它仍然具有 value someURL.com/v1
。
我发现清理、删除派生数据、重新启动 Xcode 通常可以正常工作。但不总是。无论如何,这不是一个很好的解决方案。
关于如何强制 Xcode 始终使用我的 .xcconfig 文件中的值的任何想法?最初创建配置文件时,我看到了添加构建阶段脚本的答案,该脚本touch
在我的项目的 main.m 上运行命令以强制在构建时进行协同设计,但它似乎不起作用。
谢谢!
编辑根据https://stackoverflow.com/a/41845248/962024,这看起来像是一个应该在Xcode 8.3(我目前正在使用)中解决的问题。看来是时候报备雷达了。
ios - 为一个应用处理多个环境的最佳实践是什么?
我想知道在多个环境中为我的应用程序拥有多个应用程序的最佳做法是什么?我看到一些工程师使用目标和其他使用 xcconfig 文件来更改捆绑标识符、应用程序名称、代码签名证书等的值?
那你怎么看?对我来说,我将第二个与 Fastlane 一起使用。有什么建议吗?
xcode - Xcode 8 通过命令行更改配置
我需要两个我无法找到支持的功能。第一种是通过 bash 脚本更改 Xcode 配置的名称。为此,我尝试过:
上述命令执行成功,但不会更改配置名称。它只是编译源代码。尽管我使用的是 xcodebuild,但这可能是意料之中的。
为了更改配置名称,我还查看了 xcconfig 文件。例如,我会在 Xcode 中创建一个名为 projectname-existingConfigName.xcconfig 的项目,然后我会向它添加一个新的配置名称,如下所示:
但是,在上面的例子中,我担心我没有正确使用 xcconfig 文件。在某个地方对此有很好的参考吗?
我无法找到支持的第二个功能是通过 bash 或通过 xcconfig 动态添加新配置。
最终,我想使用 bash 来执行此操作,但我也愿意接受其他不包括打开 Xcode 来执行此操作的意见。我在这里使用 git 子模块并将它们拉入并在 CI 构建期间添加动态配置是此问题的根源。
可能有更简单的方法可以做到这一点,但我想我会先在这里提出我的问题,看看我是否走在正确的轨道上。
ios - 创建 swift pod 包含 objc 标头
我将创建一个 swift pod,其中包含非模块 objc 标头中的代码,在我的例子中是<CommonCrypto/CommonCrypto.h>
. 所以它没有通过pod lint
并说找不到功能。我试过这个:
也不起作用并警告:
有没有经验丰富的救星给我指路?
ios - 可以在不触及代码依赖项的情况下运行 cocoapods 命令吗?
我的团队是一家大公司的 iOS 承包商。我们正在帮助这家大公司使用 Xcode 构建一个 iOS 应用程序,并且我们使用 Cocoapods 来管理我们在项目中的依赖项。然而,这家大公司有内部的 Cocoapods,这些 Cocoapods 托管在他们的防火墙后面,我们这些承包商无法看到或触摸。这给防火墙外的开发人员带来了许多问题,其中最重要的是 ' pod update
' 和 ' pod install
' 都失败了:
因为这些 repos/pods 很少在我们的项目之外更改,我们通常不需要从它们中实际提取新的/更新的代码。我们的团队希望能够完成“pod”命令的许多重要副作用,例如重新构建/重新生成工作区和项目文件以及其他自动魔术过程运行“更新”或“安装”(例如构建 shell 脚本)。
是否有一种“非接触式”方法来重建或创建具有 cocoapods 的 Xcode 项目的正确项目/目标/工作空间结构,即使运行命令的机器无法访问托管的 pod 也可以成功?
xcode - 如何告诉 xcode 从命令行引用特定的 xcconfig 文件进行配置
他们是一种从命令行为项目设置 xcconfig 文件的方法,就像 cocoa pods 在运行 pod install 时所做的那样吗?