266

昨天我发现了大量关于 parse.com 库的警告:

紧急:所有位码都将被删除,因为 '[path]/Parse.framework/Parse(PFAnalytics.o)' 是在没有位码的情况下构建的。您必须在启用位码的情况下重建它(Xcode 设置 ENABLE_BITCODE),从供应商处获取更新的库,或禁用此目标的位码。注意:这将是未来的错误。

我知道我可以用这个答案删除这些警告,但现在想知道它是否会对 AppStore 提交和/或我的应用程序的实际性能产生任何负面影响。

Xcode 通知您有关位码的信息

激活此设置表示目标或项目应在编译期间为支持它的平台和架构生成位码。对于存档构建,将在链接的二进制文件中生成位码以提交到应用商店。对于其他构建,编译器和链接器将检查代码是否符合生成位码的要求,但不会生成实际的位码。[ENABLE_BITCODE]

但我没有从这篇文章中得到任何真正有用的信息。

  • 我可以使用链接的答案来规避问题而不会产生任何负面影响并且不会影响未来的 AppStore 提交吗?
  • 实际做了什么ENABLE_BITCODE,将来会是非可选要求吗?
  • 如果我启用/禁用它会对性能产生影响吗?
4

7 回答 7

445
  • ENABLE_BITCODE 实际上是做什么的,将来它会是一个非可选的要求吗?

我不确定您在什么级别上寻找答案,所以让我们进行一次小旅行。其中一些你可能已经知道了。

当你构建你的项目时,Xcode 会clang为 Objective-C 目标调用和swift/swiftc为 Swift 目标调用。这两个编译器都将应用程序编译为中间表示(IR),其中一个 IR 是位码。从这个 IR 中,一个名为 LLVM 的程序接管并创建 x86 32 位和 64 位模式(用于模拟器)和 arm6/arm7/arm7s/arm64(用于设备)所需的二进制文件。通常,所有这些不同的二进制文件都集中在一个名为fat binary的文件中。

ENABLE_BITCODE 选项取消了这最后一步。它使用 IR 位码二进制文件创建应用程序版本。它有许多不错的功能,但有一个巨大的缺点:它不能在任何地方运行。为了让带有二进制位码的应用程序运行,需要将位码重新编译(可能是组装或转码……我不确定正确的动词)成 x86 或 ARM 二进制文件。

当一个比特码应用程序被提交到 App Store 时,Apple 将执行最后一步并创建完成的二进制文件。

目前,位码应用程序是可选的,但历史表明 Apple 将可选的东西变成了要求(如 64 位支持)。这通常需要几年时间,因此第三方开发人员(如 Parse)有时间进行更新。

  • 我可以使用上述方法而不会产生任何负面影响并且不会影响未来的应用商店提交吗?

是的,您可以关闭 ENABLE_BITCODE,一切都会像以前一样工作。在 Apple 将位码应用程序作为 App Store 的要求之前,你会没事的。

  • 如果我启用/禁用它会对性能产生影响吗?

启用它永远不会对性能产生负面影响,但用于测试的应用程序的内部分发可能会变得更加复杂。

至于积极的影响……那很复杂。

为了在 App Store 中分发,Apple 将为每个机器架构 (arm6/arm7/arm7s/arm64) 创建单独的应用版本,而不是一个带有胖二进制文件的应用。这意味着安装在 iOS 设备上的应用程序会更小。

此外,当重新编​​译位码时(可能是组装或转码......再次,我不确定正确的动词),它被优化。LLVM 一直致力于创造新的更好的优化。理论上,App Store 可以在 App Store 中随着 LLVM 的每个新版本重新创建应用程序的单独版本,因此您的应用程序可以使用最新的 LLVM 技术重新优化。

于 2015-07-03T12:41:53.443 回答
71

确保选择“全部”以找到启用位码构建设置:

构建设置

于 2015-09-10T17:37:54.857 回答
36

Bitcode 是iOS 9的新功能

位码是已编译程序的中间表示。您上传到 iTunes Connect 的包含位码的应用程序将在 App Store 上进行编译和链接。包含位码将允许 Apple 在未来重新优化您的应用程序二进制文件,而无需向商店提交您的应用程序的新版本。

注意:对于 iOS 应用程序,位码是默认设置,但可选。如果您提供位码,则应用程序包中的所有应用程序和框架都需要包含位码。对于 watchOS 应用,需要位码

因此,您应该禁用 bitcode,直到您的应用程序的所有框架都启用了 bitcode。

于 2015-06-27T12:26:19.543 回答
34

Bitcode 使崩溃报告变得更加困难。这是来自HockeyApp的引用(对于任何其他崩溃报告解决方案也是如此):

当将应用程序上传到 App Store 并启用“Bitcode”复选框时,Apple 将使用该 Bitcode 构建并重新编译它,然后再将其分发到设备。这将导致二进制文件获得一个新的 UUID,并且可以选择通过 Xcode 下载相应的 dSYM。

注意:答案于 2016 年 1 月编辑,以反映最近的变化

于 2015-09-23T05:36:39.690 回答
14

@vj9 谢谢。我更新到 xcode 7 。它向我显示了同样的错误。设置“NO”后构建良好

在此处输入图像描述

设置“否”它工作得很好。

在此处输入图像描述

于 2015-09-24T04:10:03.343 回答
6

文档

  • 我可以使用上述方法而不会产生任何负面影响并且不会影响未来的应用商店提交吗?

Bitcode 将允许苹果优化应用程序,而无需提交另一个构建。但是,只有在应用程序包中的所有框架和应用程序都启用了此功能时,您才能启用此功能。拥有它会有所帮助,但没有它不应该有任何负面影响。

  • ENABLE_BITCODE 实际上是做什么的,将来它会是一个非可选的要求吗?

对于 iOS 应用程序,位码是默认设置,但可选。如果您提供位码,则应用程序包中的所有应用程序和框架都需要包含位码。对于 watchOS 应用程序,需要位码。

  • 如果我启用/禁用它会对性能产生影响吗?

App Store 和操作系统通过根据用户特定设备的功能定制应用交付,以最小的占用空间优化 iOS 和 watchOS 应用的安装。这种优化称为应用程序精简,可让您创建使用最多设备功能、占用最少磁盘空间并适应 Apple 可以应用的未来更新的应用程序。其他应用程序和内容的更快下载和更多空间可提供更好的用户体验。

不应有任何性能影响。

于 2015-07-03T11:45:57.513 回答
0

我可以使用链接的答案来规避问题而不会产生任何负面影响并且不会影响未来的 AppStore 提交吗?

是的

ENABLE_BITCODE 实际上是做什么的,将来它会是一个非可选的要求吗?

ENABLE_BITCODE将代码的中间表示添加到二进制文件中。对于 watchOS,tvOS 现在是强制性的

如果我启用/禁用它会对性能产生影响吗?

归档项目时,它会影响 Xcode 构建和内存占用

[比特码]

于 2021-04-28T12:08:06.577 回答