无效的捆绑包,该捆绑包包含不允许的嵌套捆绑包,包含不允许的文件“Frameworks”。

32

我添加了一个共享框架来在应用程序和手表扩展之间分享代码。后来,我删除了共享框架,因为它引起了很多问题。我可以在iPhone和手表上构建和运行我的应用程序,但是当我提交到应用商店时,我看到以下两个错误:

ERROR ITMS-90205:“无效的Bundle。'xxx WatchKit Extension.appex'包含不允许的嵌套Bundle。”

ERROR ITMS-90206:“无效的Bundle。'xxx WatchKit Extension.appex'包含不允许的文件'Frameworks'。”

我尝试了stackoverflow上提到的所有解决方案(这个这个这个),但都没有对我有效。我该如何解决这个错误?Apple的错误信息并没有给出我应该怎么做的线索。


你最好提供每个目标的targetEmbedded Binaries的详细信息。 - icodesign
你找到解决方案了吗? - Bartłomiej Semańczyk
可能是重复的问题:[验证错误:无效的捆绑包。 捆绑包中包含不允许的文件“Frameworks”](https://dev59.com/Y18e5IYBdhLWcg3wZ5ys) - Finn Gaida
请查看我在这里的回答 - https://dev59.com/WYnda4cB1Zd3GeqPB6N8#40396491 - Vijay Sharma
Vijay的回答也解决了我的问题。 - andygeers
9个回答

17

我仍然没有完全理解是什么原因引起了这个问题,但我偶然发现了一个答案,最终解决了我的问题。

https://github.com/CocoaPods/CocoaPods/issues/4203

具体来说,2015年10月12日mikehouse发布的帖子是解决该问题的方法。

将以下运行脚本添加到所有嵌入式扩展目标中。在我的情况下,我必须将此运行脚本作为生成阶段添加到我的Today扩展和Apple Watch应用扩展中。

cd "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"
if [[ -d "Frameworks" ]]; then 
    rm -fr Frameworks
fi

4
我不认为这是解决方案,因为该脚本将删除名为“frameworks”的文件夹及其所有内容,如果应用程序依赖于任何已删除的框架,则您的应用程序将在运行时崩溃。据我理解,您需要联系那个框架的开发人员,他们可以删除或重命名该文件夹并重新构建框架。 - er.vish
1
关键是在构建阶段的最后运行脚本。 - Rishabh Tayal
非常棒。解决了依赖关系图而非树形结构所带来的问题。拯救了我的一天。 - Anton Tropashko

6
上述方法对我没有用。
嵌入式内容不包含Swift代码:否
对我来说并没有什么作用。
我遇到了使用动态框架时的问题。我的动态框架包含其他的动态框架,这使得它可以设置为:
嵌入式内容包含Swift代码:是
而其他的动态框架则需要将其设置为“否”。但是,我不得不在Build Phases下设置:
始终嵌入Swift标准库:否
将其设置为“是”会生成“frameworks”文件夹,导致上传到ITC失败。

2
这个方法可以通过上传过程(在完成上传之前我遇到了错误),但是后来我收到了苹果的一封电子邮件:我们发现了您最近提交的“InstaStickers:将Instagram照片转换为贴纸”的一个或多个问题。要处理您的交付,必须纠正以下问题:无效的捆绑包 - 您的应用程序引用的一个或多个动态库不在dylib搜索路径中。一旦这些问题得到纠正,您就可以重新交付已更正的二进制文件。问候,App Store团队 - Jorge Irún

6

6
在XCode 8中,仅仅这样做已经不再有效了。你还需要设置“始终嵌入Swift标准库:否”。 - andrewmclean

5

在主要目标中添加:

cd "${CODESIGNING_FOLDER_PATH}"
find ./PlugIns -type d -name Frameworks | xargs rm -rf

问题在于在同一项目的多个目标上添加 SPM 包会导致依赖项重复。该扩展中的框架可能已经在主要目标上了,因此这应该足够了。否则,请在主要目标上使用完整脚本,如果需要去重,则通过将它们移动到应用程序来实现去重。
不要将此添加到您的扩展目标中。它试图删除重复的框架,但没有效果,因为它在框架被复制到扩展之前运行:
# this has no effect if you add it to your extension target
cd "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"
if [[ -d "Frameworks" ]]; then 
    rm -fr Frameworks
fi

我在使用Rx作为SPM软件包在主目标、框架和扩展中的项目中遇到了这个问题。如果你也有类似的问题(例如Firebase),你可以在主目标中使用以下脚本来解决问题:

if ! [ "${CONFIGURATION}" == "Release" ] ; then

    echo "early exit"
    exit 0
fi

cd "${CODESIGNING_FOLDER_PATH}/Frameworks/"

# copy frameworks to TeamworkProjects.app/Frameworks
for framework in *; do
    if [ -d "$framework" ]; then
        if [ -d "${framework}/Frameworks" ]; then
            echo "Moving embedded frameworks from ${framework} to ${PRODUCT_NAME}.app/Frameworks"
            cp -R "${framework}/Frameworks/" .
            rm -rf "${framework}/Frameworks"
        fi
    fi
done

# remove leftover nested frameworks
for framework in *; do
    if [ -d "$framework" ]; then
        if [ -d "${framework}/Frameworks" ]; then
            echo "Removing embedded frameworks from ${framework} to ${PRODUCT_NAME}.app/Frameworks"
            rm -rf "${framework}/Frameworks"
        fi
    fi
done

# Remove Frameworks from PlugIns
cd "${CODESIGNING_FOLDER_PATH}"
find ./PlugIns -type d -name Frameworks | xargs rm -rf

# codesign for Debugging on device
if [ "${CONFIGURATION}" == "Debug" ] & [ "${SDKROOT}" != *Simulator* ] ; then

    echo "Code signing frameworks..."
    find "${CODESIGNING_FOLDER_PATH}/Frameworks" -maxdepth 1 -name '*.framework' -print0 | while read -d $'\0' framework
    do
        # only sign frameworks without a signature
        if ! codesign -v "${framework}"; then
            codesign --force --sign "${EXPANDED_CODE_SIGN_IDENTITY}" --preserve-metadata=identifier,entitlements --timestamp=none "${framework}"
            echo "Added missing signature to '${framework}'"
        fi
    done
fi

这个脚本的大部分来自于用户pewe在forums.swift.org上的帖子:多个目标中使用Swift packages会导致库代码重复


在存档构建时,您能确认此功能是否有效吗? - markturnip

3

我将一个Swift动态库打包成子项目并添加到了我的主项目和其他子项目中。上传到TestFlight时,我也遇到了这个问题。

如图所示,我将子项目的Embed & Sign更改为Do Not Embed,然后该问题得到解决。

在我的主项目中,保持Embed & Sign不变。但是在子项目中,我将它们更改为Do Not Embed

enter image description here


3
我有一个使用以下构建设置构建的框架:
始终嵌入Swift标准库:是
允许在框架模块中包含非模块化内容:是
所以我将两者都更改为“否”,然后重新构建了框架。
始终嵌入Swift标准库:否
允许在框架模块中包含非模块化内容:否
我将新的框架构建添加到我的项目中,因此它成功上传到iTunes Connect。

2
我有一个使用我自己实现的自定义框架的今日小部件。
我尝试了所有的解决方案,但都没有起作用。
我只需要在今日小部件中使用自定义框架,所以我将该框架链接并嵌入到今日小部件中。
错误信息显示:
该包含被禁止的框架。
今日小部件不应嵌入任何框架,只需链接即可。
因此,我从今日小部件中删除了该框架,并将其添加到父应用程序中。
请注意:
由于已将该框架添加到父应用程序中,因此父应用程序应使用该框架,导入即可。

2
如果有人在这篇帖子发布后的8年内遇到了这个问题,以下是我在浏览了各种讨论串后找到的解决方法:
我的项目中有5个框架附加到项目中。

enter image description here

我的主要目标(在这种情况下 - meteo-lt)已经嵌入并准备好签名的所有框架。看起来这里似乎还不错。

enter image description here

但问题是,所有其他框架也在相互嵌入。
例如:
- MeteoLTUI 嵌入(无论是否签名 - 都是同样的问题)MeteoLTDomain 和 MeteoLTUtilities。 - MeteoLTNetwork 实现 MeteoLTDomain 和 MeteoLTUtilites。 - MeteoLTUtilities 实现 MeteoLTDomain。 - 以此类推...
我所要做的就是在主目标 meteo-lt 上保留 Embed & Sign 的设置,并在所有其他框架中设置为 Do not embed,这样它们就不会相互嵌入并创建嵌套嵌入。
换句话说:
你不能将 B 嵌套在 A 中。
- .app
  - Frameworks
    - A.framework
      - Frameworks
        - B.framework

相反,你需要这样做:
- .app
  - Frameworks
    - A.framework
    - B.framework

P.S. 如果这并没有帮助到你,而且你计划并且正在设置所有框架的主目标为不嵌入,请确保在此之前阅读以下文章:

https://holyswift.app/frameworks-embed-or-not-embed-thats-the-question/

https://pratheeshbennet.medium.com/static-library-vs-dynamic-library-in-ios-55478ed53a03


1

请记住,不应嵌入嵌套框架中的&符号 输入图像描述 将嵌入&符号更改为不要嵌入即可解决问题, 我已经解决了它,感谢AechoLiu的答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接