我添加了一个共享框架,用于在app和watch扩展程序之间共享代码。后来我删除了共享框架,因为它会导致很多问题。我可以建立 并在iphone上运行我的应用程序并观看。但是当我提交到app store时,我看到了这两个错误:
错误ITMS-90205:"无效的捆绑包。在' xxx WatchKit Extension.appex' 包含不允许的嵌套包。"
错误ITMS-90206:"无效的捆绑包。在' xxx WatchKit Extension.appex' 包含不允许的文件'框架'。"
我已经尝试了stackoverflow上提到的所有解决方案(this,this,this)这些解决方案都不适用于我。我该如何修复错误?来自苹果的错误信息确实无法说明我应该做些什么。
答案 0 :(得分:12)
我仍然不完全明白导致这个问题的原因,但我偶然发现了一个最终为我解决问题的答案。
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
答案 1 :(得分:6)
此帖子中解决了“ITMS-90206”错误:Validation Error: Invalid Bundle. The bundle at ... contains disallowed file 'Frameworks'
需要在WatchKit扩展程序的Build选项中将设置从Yes更改为No:
Embedded Content Contains Swift Code: No
答案 2 :(得分:6)
以上对我没有用。
Embedded Content Contains Swift Code: NO
我真的没有为我做任何事情。
我使用动态框架遇到了这个问题。 我的动态框架包含其他动态框架,这使得它没问题 拥有:
Embedded Content Contains Swift Code: YES
而是让其他动态框架将其设置为No。 但我不得不设置
Always Embed Swift Standard Libraries: NO
在Build Phases下。
将此项设置为YES会导致frameworks
文件夹导致上传到ITC失败。
答案 3 :(得分:2)
我有一个今天的扩展,它使用我实现的自定义框架。
我尝试了所有解决方案,但对我没有任何帮助。
我仅在今天的扩展中需要自定义框架,因此我仅在今天的扩展中链接并嵌入了该框架。
错误所代表的是:
该捆绑包包含不允许的框架
今天的扩展不应嵌入任何框架,而应链接到该框架。
因此,我从今天的扩展程序中删除了该框架,并将其添加到了父应用程序中。
请注意:
父应用程序应使用此框架,因为已将其添加到其中,导入将完成此工作。
答案 4 :(得分:0)
我有一个使用以下构建设置构建的框架:
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。
答案 5 :(得分:0)
我将一个 swift 包,它是动态库,添加到子项目和我的主项目中。上传到 TestFlight 时,我也遇到了这个问题。
如图,我把子项目的Embed & Sign
改为Do Not Embed
,然后这个问题就解决了。
它为我的主要项目保留了 Embed & Sign
。但在子项目中,我将它们更改为 Do Not Embed
。
答案 6 :(得分:0)
在主目标中添加:
cd "${CODESIGNING_FOLDER_PATH}"
find ./PlugIns -type d -name Frameworks | xargs rm -rf
问题是在同一个项目的多个目标上添加 SPM 包会重复依赖项。这个扩展的框架可能是主要目标,所以这应该足够了。否则,请在主要目标上使用以下完整脚本,如果需要,将通过将框架移至应用程序来消除重复框架。
不要在你的扩展目标中添加这个,因为它会在框架被复制到扩展之前运行。
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
该脚本的大部分来自于 forums.swift.org 上的用户 pewe:Swift packages in multiple targets results in duplication of library code。