无效的捆绑包,捆绑包包含不允许的嵌套捆绑包,包含不允许的文件"框架"

Way*_*hao 19 ios cocoapods watchkit

我添加了一个共享框架,用于在app和watch扩展之间共享代码.后来我删除了共享框架,因为它会导致很多问题.我可以在iphone上构建和运行我的应用程序并观看.但是当我提交到app store时,我看到了这两个错误:

ERROR ITMS-90205:"无效的捆绑包.'xxx WatchKit Extension.appex'的捆绑包含不允许的嵌套捆绑包."

ERROR ITMS-90206:"无效的捆绑包.'xxx WatchKit Extension.appex'包含不允许的文件'Frameworks'."

我已经尝试了stackoverflow上提到的所有解决方案(这个,这个,这个)它们都不适用于我.我该如何修复错误?来自苹果的错误消息实际上并不能说明我应该做些什么.

cgo*_*ain 13

我仍然不完全明白导致这个问题的原因,但我偶然发现了一个最终为我解决问题的答案.

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

具体来说,迈克豪斯于2015年10月12日发布的帖子就是问题的解决方案.

将以下运行脚本添加到所有嵌入式扩展目标.在我的情况下,我不得不将运行脚本作为构建阶段添加到我的Today扩展和Apple Watch App扩展.

cd "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"
if [[ -d "Frameworks" ]]; then 
    rm -fr Frameworks
fi
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这是解决方案,因为脚本将删除名为框架及其所有内容的文件夹,如果应用程序依赖于任何删除的框架,您的应用程序将在运行时崩溃.根据我的理解,您需要联系该框架的开发人员.他们可以删除或重命名文件夹并重建框架. (2认同)

use*_*023 7

以上对我不起作用.

Embedded Content Contains Swift Code: NO

没有真正为我做任何事情.

我使用动态框架遇到了这个问题.我的动态框架包含其他动态框架,这使得可以:

Embedded Content Contains Swift Code: YES

而是让其他动态框架将其设置为No.但不是我必须设置

Always Embed Swift Standard Libraries: NO

在构建阶段.

将此设置为YES会frameworks导致导致上载到ITC 的文件夹失败.

  • 这有助于通过上传过程(我在完成上传之前遇到错误)然后收到一封来自 Apple 的电子邮件:我们发现您最近交付的“InstaStickers:将 Instagram 照片变成贴纸”有一个或多个问题。要处理您的交付,必须更正以下问题: Invalid Bundle - dylib 搜索路径中不存在您的应用程序引用的一个或多个动态库。更正这些问题后,您就可以重新交付更正后的二进制文件。问候, App Store 团队 (2认同)

小智 6

此帖子中解决了"ITMS-90206"错误:验证错误:无效的捆绑包.在...包含不允许的文件'框架'

需要在WatchKit扩展的Build选项中将设置从Yes更改为No:

Embedded Content Contains Swift Code: No
Run Code Online (Sandbox Code Playgroud)

  • 这在XCode 8中不再有效.您还需要设置"Always Embed Swift Standard Libraries:NO" (3认同)

Jan*_*ano 5

在主要目标中添加:

cd "${CODESIGNING_FOLDER_PATH}"
find ./PlugIns -type d -name Frameworks | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

问题在于,在同一项目的多个目标上添加 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
Run Code Online (Sandbox Code Playgroud)

我在一个项目中遇到了这个问题,该项目在主要目标、框架和扩展中使用 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
Run Code Online (Sandbox Code Playgroud)

该脚本的大部分内容来自 forums.swift.org 上的用户 pewe:多个目标中的 Swift 包会导致库代码重复