ios 包无效,包包含不允许的嵌套包,包含不允许的文件“Frameworks”

gr8qqesn  于 2023-04-08  发布在  iOS
关注(0)|答案(8)|浏览(261)

我添加了一个共享框架来在app和watch扩展之间共享代码。后来我删除了共享框架,因为它会导致很多问题。我可以在iPhone和watch上构建和运行我的app。但是当我提交到app store时,我看到以下两个错误:
ERROR ITMS-90205: "Invalid Bundle. The bundle at 'xxx WatchKit Extension.appex' contains disallowed nested bundles."
ERROR ITMS-90206: "Invalid Bundle. The bundle at 'xxx WatchKit Extension.appex' contains disallowed file 'Frameworks'."
我已经尝试了stackoverflow上提到的所有解决方案(thisthisthis)没有一个对我有效。我如何修复错误?来自苹果的错误消息真的没有给予我一个线索。

ippsafx7

ippsafx71#

我仍然不完全明白是什么原因导致了这个问题,但我偶然发现了一个答案,终于为我解决了这个问题。
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
zxlwwiss

zxlwwiss2#

“ITMS-90206”错误已在此帖子中解决:Validation Error: Invalid Bundle. The bundle at ... contains disallowed file 'Frameworks'
需要在WatchKit Extension的Build选项中将该设置从Yes更改为No:

Embedded Content Contains Swift Code: No
bmvo0sr5

bmvo0sr53#

上面的建议对我不起作用。
Embedded Content Contains Swift Code: NO
对我没什么帮助。
我在使用动态框架时遇到了这个问题。我的动态框架包含其他动态框架,因此可以使用:
Embedded Content Contains Swift Code: YES
而不是让其他动态框架将其设置为No。
Always Embed Swift Standard Libraries: NO
在“生成阶段”下。
将此设置为YES会生成frameworks文件夹,导致上载到ITC失败。

w46czmvw

w46czmvw4#

在主目标中添加:

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

此脚本的大部分来自www.example.com上的用户peweforums.swift.org:Swift packages in multiple targets results in duplication of library code

wnavrhmk

wnavrhmk5#

我有一个框架,使用以下构建设置构建:
Always Embed Swift Standard Libraries: YES
Allow Non-Modular includes in Framework Modules: YES
因此,我将两者都改为NO并再次构建框架。
Always Embed Swift Standard Libraries: NO
Allow Non-Modular includes in Framework Modules: NO
我在我的项目中添加了新的框架构建,因此它成功上传到iTunes Connect。

cnh2zyt3

cnh2zyt36#

我在子项目和主项目中添加了一个swift包,它是动态库。当上传到TestFlight时,我也遇到了这个问题。
如图所示,我将子项目的Embed & Sign更改为Do Not Embed,然后解决了这个问题。
它为我的主项目保留了Embed & Sign,但在子项目中,我将它们更改为Do Not Embed

pbpqsu0x

pbpqsu0x7#

我有一个today扩展,它使用了我实现的自定义框架。
我尝试了所有的方法,但没有一个对我有效。
我只需要在today扩展中使用自定义框架,所以我只在today扩展中链接并嵌入了这个框架。
错误的意思是:
捆绑包包含不允许的框架
今天的扩展不应该嵌入任何框架,只应该链接到它。
因此,我从today扩展中删除了框架,并将其添加到父应用程序中。

注意:

父应用程序应该使用这个框架,因为它被添加到它,导入应该做的工作。

8fsztsew

8fsztsew8#

请记住,不应该嵌入和签署嵌套框架

更改嵌入和签署不嵌入将解决问题,我已经解决了它,感谢AechoLiu的回答

相关问题