Xcode - 错误 ITMS-90635 - 捆绑包中的无效 Mach-O 文件 - 提交到应用商店

72
我刚在提交应用到应用商店时遇到了这个错误。

enter image description here

这是否意味着我需要为所有依赖项设置ENABLE_BITCODE?我尝试过,但是后来出现错误,说依赖项与位码不兼容(或类似的内容)...

好的,我已经在构建设置中打开了ENABLE_BITCODE,并且不得不更新Facebook Kit,现在它可以正常工作了。 - Nuno Gonçalves
7个回答

66

今天早上我也遇到了同样的问题。实际上,答案就在错误信息中:“验证一个平台的所有目标是否针对ENABLE_BITCODE构建设置有一致的值”。

我的一个目标(ENABLE_BITCODE设为NO),使用了多个启用了ENABLE_BITCODE的库。所以,我需要在项目目标中将ENABLE_BITCODE设置为YES。但我想你可以选择,在使用的所有库中都将ENABLE_BITCODE设置为NO。


1
我按照我的问题评论中提到的更新了项目的构建设置。但是我想知道,我在哪里可以找到特定库的构建设置?我在整个项目中搜索ENABLE_BITCODE,只找到了主项目目标中的一个。 - Nuno Gonçalves
1
这取决于您导入库的方式。对我来说,由于我使用Cocoapods,在我的工作区中,我有一个pods项目。当我点击我的pods项目时,我可以看到所有可用的目标。 - Guillaume L.
1
很高兴能帮忙!对我来说也是一样,我的所有库都使用了位码,所以更新项目比更新所有的Pods更容易 :) 现在准备好迎接下一个问题吧:PIE警告 ;) - Guillaume L.
是的,我已经收到了苹果公司关于这个问题的电子邮件。我猜他们今天在改变一些东西。 :) 如果我们不处理好PIE(位置无关代码),总有一天它会再次停止工作。 - Nuno Gonçalves
错误很可能来自于 Google 和 Facebook 的 pods。 - thibaut noah
显示剩余5条评论

64

最简单和最常见的解决方法:

您可以在通过Xcode提交应用程序时取消选择“包括位码”选项。 uncheck the box

如果您使用xcodebuild,则可以使用传递值为uploadBitcode设置为false的exportOptionsPlist。在我的情况下,我们正在使用xctool构建应用程序,并且没有能力传递exportOptionsPlist,因此我们不得不从所有框架中删除位码。


如果有人正在使用Cocoapods并想要为其框架禁用位代码,只需将以下内容添加到您的podfile中:
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ENABLE_BITCODE'] = 'NO'
    end
  end
end

通过 https://dev59.com/8FwY5IYBdhLWcg3waXO5#32685434


为了更好地解释这个问题,我想补充一些内容:
看起来苹果公司昨天刚开始执行这个规定。如果你的主二进制文件禁用了位码(bitcode),但你包含了一个启用了位码的静态库或框架,它将无法通过验证。反之亦然:如果你的主二进制文件启用了位码,但你包含了一个禁用了位码的库/框架,它也将无法通过验证。
我从GoogleMaps和Amazon获取了一些依赖项,使得将所有东西都切换为启用位码变得非常困难,因此我只是禁用了它并从我导入项目中的一个静态库中删除了位码。你可以使用以下命令从任何二进制文件中删除位码。
$ xcrun bitcode_strip -r {Framework}.dylib -o tmp.dylib
$ mv tmp.dylib {Framework}.dylib

https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc7_release_notes.html

虽然上述是解决问题的方案,但我不同意如果主二进制文件禁用位码,则所有包含的二进制文件也应该需要它。 位码只是一些IR代码,苹果可以用于应用程序瘦身-他们为什么不从其他二进制文件中剥离它(我认为这就是他们以前所做的)? 对我来说,这没有太多意义。
苹果论坛 https://forums.developer.apple.com/thread/48071

1
这也是我所需要的。我们使用两个预编译的二进制库,一个启用了位码,另一个禁用了位码。而且没有办法重新编译它们中的任何一个以匹配设置! - Jeff Lockhart
非常感谢,真的很有帮助! - Svitlana
2
如果您有一个WatchApp,那么这将不起作用,因为您必须提交WatchApp的位码。 - RPM

5
我刚刚取消了“包括位码”选项,然后它就开始上传了。

错误的方式。在问题中,嵌入式框架已启用,而应用程序没有启用。 - Droppy
请查看@Guillaume的答案。 - Nuno Gonçalves
这并没有帮助。我的应用被拒绝了。 - Yestay Muratov

3

对于Carthage

  1. 在您的项目文件夹中打开库(Carthage -> Checkouts -> [库名称]
  2. 然后在Xcode中打开每个库
  3. 在构建设置中将“启用位码”设置为“否”enter image description here
  4. 对于列表中的每个库都这样做
  5. 生成Carthagecarthage build --platform xxx

然后您就可以成功地归档并提交到App Store了


1

我们在上周五(2016年6月3日)开始遇到相同的错误“Xcode - Error ITMS-90635 - Invalid Mach-O in bundle - submitting to App store”...使用以下2个步骤解决了这个问题:

第一步:
在 pod 文件中添加代码以标记 'ENABLE_BITCODE' = 'NO' 在 pods 中

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ENABLE_BITCODE'] = 'NO'
    end
  end
end

步骤2:
在项目的pods中标记'ENABLE_BITCODE' = 'NO'

注意:尝试使用'ENABLE_BITCODE' = 'YES'在pods和我的项目中进行标记,但由于我们使用了具有标志-read_only_relocs的twillio框架进行调用,因此不允许使用'ENABLE_BITCODE' = 'YES'进行编译。因此,如果您的应用程序不使用任何带有-read_only_relocs的框架,则可以继续使用'ENABLE_BITCODE' = 'YES',因为它对您的应用程序有好处。


0

我在我的 Xcode 7.3 CI 中,使用 ENABLE_BITCODE = YES 的项目以及依赖项 ENABLE_BITCODE = YES 遇到了同样的问题。

解决方法是将 Xcode 更新到最新版本(7.3.1)。


0
对于那些在将 "Enable BitCode" 设为 Yes 后遇到构建错误的人。 我必须更新所有库,但最简单的部分是我使用了Cocoapods。 所以,请更新您的所有 pod 项目: (一个接一个地)或全部更新

然后在归档之前将 Enable BitCode 设置为 "No"。

然后归档>>上传>>它会通过此错误。

干杯。


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