我正在开发一个iOS应用程序(A),它嵌入了一个内部开发的框架(B)。在构建应用程序时,框架的依赖项被嵌入到框架本身中,这会导致app验证过程以错误的方式拒绝应用程序:
ERROR ITMS-90206: "Invalid Bundle. The bundle at 'A.app/Frameworks/B.framework' contains disallowed file 'Frameworks'
检查构建的.app
包证实了这一点。
应用程序和内部框架的依赖关系都由Swift软件包管理器管理,这是通过将所需的包依赖项添加到每个项目和每个目标的“框架和库”+“与库的链接二进制”来设置的。所有框架B的依赖项都由应用程序共享,而B本身并不是Swift包。
我以前使用Carthage进行依赖关系管理,并通过将应用程序的依赖项设置为"Embed & Sign“,并将框架的依赖项设置为"Frameworks”下的“Not”,从而避免了这个问题。此设置确保了所有框架依赖项都包含在A.app/Frameworks/
中,并将B.framework链接到这些依赖项中。但是,SPM没有给出任何可见的选项来以这种方式修改行为。
假设我没有以错误的方式处理这个问题,那么如何确保Xcode不将框架的SPM依赖项嵌入到框架本身,而是动态地将它们链接到应用程序的版本?
发布于 2022-03-29 19:18:03
我看到的是完全一样的行为。对于Xcode < 13.3,我们使用了以下脚本:
#!/bin/bash
# See https://bugs.swift.org/browse/SR-14292
set -euxo pipefail
cp -r "${BUILT_PRODUCTS_DIR}"/InternalFramework.framework/Frameworks/* "${TARGET_BUILD_DIR}"/"${FRAMEWORKS_FOLDER_PATH}"
rm -rf "${TARGET_BUILD_DIR}"/"${FRAMEWORKS_FOLDER_PATH}"/InternalFramework.framework/Frameworks/
这不适用于Xcode 13.3,因为Xcode 13.3没有将框架嵌入到InternalFramework.framework的框架/文件夹中。
如果您显式地列出了要嵌入的框架,则可能会执行这样的操作:
frameworks=(
AWSCore.framework AWSS3.framework
…
)
for framework in "${frameworks[@]}"
do
rm -rf "${TARGET_BUILD_DIR:?}"/"${FRAMEWORKS_FOLDER_PATH}/$framework"
cp -r "${BUILT_PRODUCTS_DIR}"/$framework "${TARGET_BUILD_DIR}"/"${FRAMEWORKS_FOLDER_PATH}"
done
这将适用于模拟器,也可能是App提交。要在设备上运行,这需要首先对框架重新签名。
https://stackoverflow.com/questions/70700998
复制相似问题