你能自动在你的可执行文件中嵌入一个iOS框架吗?

时间:2014-10-28 05:49:37

标签: ios xcode xcode6

我有一个iOS应用程序,它将“Framework A”作为子项目,并将其作为目标依赖项包含在内。 “框架A”具有“框架B”具有子项目并将其包括为目标依赖项。最后,“框架B”将“框架C”作为子项目并将其作为目标依赖项包含在内。

此项目构建良好,可在模拟器中完美运行,但会立即出现错误dyld: Library not loaded: @rpath/Framework A.framework/Framework A

问题是“Framework A.framework”文件不会自动复制到应用程序的可执行文件中。您可以向应用目标添加“复制文件”构建阶段,并指定“Framework A.framework”应嵌入到可执行文件中,但此解决方案不会扩展。您仍然缺少“Framework B.framework”和“Framework C.framework”。

例如,假设您有一个复杂的依赖结构,如问题What is the correct process for linking static libraries that have common static libraries?中所述。您必须手动将六个框架嵌入到可执行文件中,如果根框架添加了更多依赖项,则项目将不再构建。您必须记住手动嵌入任何新的依赖项。

所以有人知道Xcode是否有办法自动嵌入你的目标依赖框架(就像它对静态库一样)或为什么Apple不这样做?特别是对于iOS来说,让Xcode构建框架到构建目录并且对它们完全没有任何意义似乎毫无意义。

2 个答案:

答案 0 :(得分:1)

我找不到让Xcode自动执行此操作的方法。最后,我更新了编写我作为后期构建阶段添加的脚本

frameworksDirectory=${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Frameworks
mkdir -p "${frameworksDirectory}"

for framework in "${CONFIGURATION_BUILD_DIR}"/*.framework
do
    if [ -d "${framework}" ]; then
        cp -r "${framework}" "${frameworksDirectory}"
    fi
done

for framework in "${CONFIGURATION_BUILD_DIR}/../Release${EFFECTIVE_PLATFORM_NAME}"/*.framework
do
    if [ -d "${framework}" ]; then
        cp -r "${framework}" "${frameworksDirectory}"
    fi
done

答案 1 :(得分:-1)

如何自动复制框架的简短答案是使用依赖项管理器。需要依赖关系管理器才能正确执行。唯一的另一个答案是避免多级依赖(这通常是首选,但并非总是可行)。

您的脚本仅适用于仅构建每个框架的一个版本的情况。它不会检测正在构建的同一框架的多个版本的情况,并且如果发生这种情况,可能会导致未定义的行为而不发出警告。您可能对构建系统有一定的了解,知道没有冲突的子框架,但Xcode没有。证明没有冲突意味着建立一个依赖管理器。

在我看来,对依赖管理器的需求是框架过于复杂使用的标志。但有些情况下它很有用。

你不应该只是复制一切并希望它有效(这是Xcode没有的一个原因)。在我看来,现在最好的依赖管理器是Carthage。目前最受欢迎的依赖管理器是CocoaPods

有关此问题更专业版的更多讨论,请参阅Why are umbrella frameworks discouraged?