验证错误: 无效的包。包在... 包含不允许的文件’框架’

我试图提交一个应用程序与 Xcode 6通用汽车,我得到这个验证错误。这个应用程序有一个动作扩展和一个动态框架,它们在扩展和应用程序本身之间共享。

我在项目中没有任何叫做“框架”的文件,所以我真的不知道这是什么意思。有人知道这个问题或者有什么想法吗?

here's what the error looks like

由于下面列出的问题,归档验证失败。
ITunes 商店操作失败。
无效的捆绑包。在... 的捆绑包包含不允许的文件’框架’。

72427 次浏览

原来这个错误与使用 Swift 有关(应用程序和扩展程序都使用了 Swift)。

对于这个应用程序,我必须设置:

Embedded Content Contains Swift Code: YES

以及延期:

Embedded Content Contains Swift Code: NO

Xcode 8和9

看起来这个应用程序在 Xcode 8和9中被重命名为 Always Embed Swift Standard Libraries:

Always Embed Swift Standard Libraries: YES

以及延期:

Always Embed Swift Standard Libraries: NO

因此,从构建设置中修复这个问题需要3个步骤

  1. 集装箱应用程序: Embedded Content Contains Swift Code: YES
  2. 分机: Embedded Content Contains Swift Code: NO
  3. 扩展: Runpath Search Path = @executable_path/../../Frameworks

对我来说,解决方案是从扩展的嵌入式二进制文件中删除框架,并将其添加到扩展的链接框架和库中。(两者都可以在扩展的 General 选项卡中找到。)

对我来说,唯一有效的解决方案是将这个 Run Script 添加到应用程序扩展目标:

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

enter image description here 来源: http://github.com/cocoaPods/cocoaPods/issues/4203”rel = “ norefrer”> https://github.com/cocoapods/cocoapods/issues/4203

删除标题中包含 embed单词的扩展名的每个 建造阶段

此外:

  • 对于扩展目标,必须将包含 Swift 代码 的嵌入内容设置为 Yes

我第一次使用 XCode7.1.1时遇到了这个问题,因为我的应用程序有今天扩展(在我的项目中没有 Swift)。 这个脚本(https://github.com/CocoaPods/CocoaPods/issues/4203)对我不起作用。

将 cocoapods 降级到0.39.0. beta. 3版本,运行 pod install,然后重新归档解决了这个问题。

如果 嵌入 Pods 框架脚本和 罗曼的剧本都存在于同一个目标中。

请检查嵌入式豆荚框架是否位于另一个之前。如果没有,就把罗曼的剧本移到最后。

在我的例子中,我刚刚升级到 CocoaPods 1.0.1,这似乎是一个新的 bug。

Pod 更新将一个运行脚本添加到我的扩展的目标中,该目标创建了 Framework 文件夹。当我准备添加@Roman 的 run 脚本来删除它时,我发现了它。

解决方案是从我的扩展的构建阶段删除这个脚本。

enter image description here

以上的答案对我来说都不管用。这是因为错误不是由父应用程序或其扩展引起的。而是其中一个链接库出了问题。

要确认,首先使用 Xcode 归档,然后使用 Organiser 选择条目并使用 Show in Finder 定位。这将显示 .xcarchive文件。

选择该文件并选择“显示包内容”。

在 Products/Applications 文件夹中选择. app,然后再次选择“ Show Package Content”。

在“框架”文件夹中找到有问题的模块。例如,如果错误是:

ERROR ITMS-90206: "Invalid Bundle. The bundle at 'MyApp.app/Frameworks/MyLib.framework' contains disallowed file 'Frameworks'."

然后在 Frameworks/MyLib.framework中可能会看到以下内容:

../Frameworks/libswiftContacts.dylib
../Frameworks/libswiftCore.dylib
../Frameworks/libswiftCoreData.dylib
../Frameworks/libswiftCoreGraphics.dylib
../Frameworks/libswiftCoreImage.dylib
../Frameworks/libswiftCoreLocation.dylib
../Frameworks/libswiftDarwin.dylib
../Frameworks/libswiftDispatch.dylib
../Frameworks/libswiftFoundation.dylib
../Frameworks/libswiftLocalAuthentication.dylib
../Frameworks/libswiftObjectiveC.dylib
../Frameworks/libswiftPassKit.dylib
../Frameworks/libswiftUIKit.dylib
../Frameworks/libswiftWebKit.dylib

它们之所以存在,是因为父应用程序包含的链接库或模块具有 EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;

在 Xcode 找到依赖模块并更新标志:

enter image description here

注意,在克服了这个问题之后,这个应用程序可能仍然会被 iTunes 商店拒绝,并附上一封解释性的电子邮件:

Invalid Swift Support - The Watch OS application has Swift libraries at both...

这又回到了 EMBEDDED_CONTENT_CONTAINS_SWIFT标志。确保只有父应用程序将此设置为 YES。WatchKit 应用程序和扩展都必须将这个标志设置为 NO。这在上面迈克的回答中同样详细。

如果您正在使用 CocoaPods,我会考虑在有问题的目标(扩展)上删除 Embed 框架构建阶段,这为我解决了问题。

  1. 容器应用程序: 构建设置-> 嵌入内容包含快速代码: 是的
  2. 扩展: 构建设置-> 嵌入内容包含快速代码: 没有
  3. 扩展: 构建阶段-> 在

Cd“ ${ CONFIGURATION _ BUILD _ DIR }/${ UNLOCALIZED _ RESOURCES _ FOLDER _ PATH }/” 如果[[-d“框架”]] ; 则 Rm-fr 框架 Fi

  1. (重要)扩展: 构建阶段-> 将 运行脚本移动到 最后一个(在嵌入 Pods 框架脚本之后)

我无法找到任何设置为 Embedded Content Contains Swift Code,但我能够找到一个设置 Always Embed Swift Standard Libraries和设置这为否,我的框架确实解决了这个问题。

在我的例子中,有一个 CocoaPod 库“ Blockly”指定“总是嵌入快速标准库”的 Yes。在选择“不”之后,它起作用了。enter image description here

我得到了同样的错误,还有一个

不允许嵌套包错误

我的问题是关于 SquareReaderSDK.framework的,但是我必须按照他们的说明添加一个新的 run 脚本:

FRAMEWORKS="${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}"
"${FRAMEWORKS}/SquareReaderSDK.framework/setup"

这里列出的所有构建设置都没有为我解决这个问题。不过,在将一些框架从“嵌入式二进制文件”移动到“链接框架和库”之后,我确实让这种方法起作用了。

看起来我的主应用和我的一个自定义框架有相同的框架依赖性,这似乎是一个不,但移动它在我的主应用从嵌入式区域到链接区域允许我成功上传应用没有错误。

我得到了同样的错误,这是因为我将框架复制到了扩展包中。事实证明,扩展使用的框架应该复制到 Main App bundle 中,并且只在扩展构建设置中链接(而不是复制)。一定要有搜索路径’@Executive _ path/。./../框架的扩展构建。我认为这个路径是 XCode 10自动添加的。

我发现了很多这样的问题,但没有一个能帮我解决问题,所以希望这个能帮到别人。

我正在创建一个应用程序,有一个意图扩展(Siri 快捷方式) ,我正在使用一个框架的代码共享之间的扩展和我的应用程序,由苹果推荐。

我已经在目标的“常规”设置的“框架和库”部分将我的框架添加到我的扩展中。在这里添加框架时,有两列。一个表示框架的名称,另一个表示“嵌入”。我没有在“ Embed”专栏中显示任何内容,所以我认为这没问题,但是我必须为框架的该专栏明确选择“ Do Not Embed”选项。当我这样做并在 Xcode 存档时,我可以看到在验证过程中,该框架不再列在我的 ipa 内容下的每个目标下,但只有一次,验证最终成功。

以上的答案对我不起作用。我做了以下的事情。

  1. 从团队中的其他开发人员复制扩展的目标设置
  2. 容器应用程序: 嵌入式内容包含快速代码: YES
  3. 扩展: 嵌入式内容包含快速代码: NO

请检查从目标的每一个扩展设置。

在我的案例中,Firebase SPM 是罪魁祸首。由于框架文件夹的原因,我有一个没有通过 AppStore 验证的 Share 。我在模式中用一个后归档脚本修复了这个问题:

Scheme script

您应该从所有的 pods 和扩展中删除嵌入式框架,就像在 https://stackoverflow.com/a/40396491/2559850中描述的那样

您必须添加 < strong > 构建阶段 的脚本 直到最后

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

enter image description here

为了 Unity3D

  1. 将“总是嵌入快速标准库”设置为 YES Unity-iPhone 目标

  2. 删除框架文件夹中的 . xcodearchive (见图) 存档路径 ~/Library/Developer/Xcode/Archives

enter image description here

enter image description here 来自 Unity forum < a href = “ https://forum.unity.com/thread/2019-3-valid- on-upload- to-store-give-unityframework- frame- has-disallow-file e. 751112/”rel = “ nofollow norefrer”> https://forum.unity.com/threads/2019-3-validation-on-upload-to-store-gives-unityframework-framework-contains-disallowed-file.751112/