首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止框架依赖项在使用Swift包管理器时嵌入

防止框架依赖项在使用Swift包管理器时嵌入
EN

Stack Overflow用户
提问于 2022-01-13 17:55:21
回答 1查看 477关注 0票数 4

我正在开发一个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依赖项嵌入到框架本身,而是动态地将它们链接到应用程序的版本?

EN

回答 1

Stack Overflow用户

发布于 2022-03-29 19:18:03

我看到的是完全一样的行为。对于Xcode < 13.3,我们使用了以下脚本:

代码语言:javascript
运行
复制
#!/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的框架/文件夹中。

如果您显式地列出了要嵌入的框架,则可能会执行这样的操作:

代码语言:javascript
运行
复制
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提交。要在设备上运行,这需要首先对框架重新签名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70700998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档