ChatGPT解决这个技术问题 Extra ChatGPT

Xcode 构建选项“启用位码”的影响是/否

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

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

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

Xcode 通知您有关位码的信息

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

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

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

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

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


B
BoiseBaked

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

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

构建项目时,Xcode 为 Objective-C 目标调用 clang,为 Swift 目标调用 swift/swiftc。这两个编译器都将应用程序编译为 intermediate representation (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 技术重新优化。


“Apple 将为每个机器架构(arm6/arm7/arm7s/arm64)创建单独的应用程序版本,而不是一个带有胖二进制文件的应用程序。这意味着安装在 iOS 设备上的应用程序会更小。”这就是切片所做的。这与Bitcode无关。
“ENABLE_BITCODE 选项取消了这最后一步。”它没有删减任何步骤。仍然会生成所有架构二进制文件。然后为每个架构添加 PLUS 位码信息。请参阅stackoverflow.com/a/31030741/102008
请参阅developer.apple.com/library/prerelease/watchos/documentation/…“切片是为不同目标设备创建和交付 app bundle 变体的过程。变体仅包含目标设备所需的可执行架构和资源。”
与禁用 Bitcode 时相比,启用 Bitcode 会使设备上安装的应用程序更小,这并不是一个正确的说法。哪里都没有这么说。
@onmyway133 并非所有供应商都提供源代码。如果供应商提供的只是静态库和头文件(或框架),那么供应商需要在启用位码的情况下编译他们的东西。
G
Gamma-Point

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

https://i.stack.imgur.com/GR5If.png


最后一个屏幕截图(另外,为什么除非禁用位码,否则提交到商店不起作用..?)
C
Community

位码是 iOS 9 的新功能

位码是已编译程序的中间表示。您上传到 iTunes Connect 的包含位码的应用程序将在 App Store 上进行编译和链接。包含位码将允许 Apple 在未来重新优化您的应用程序二进制文件,而无需向商店提交您的应用程序的新版本。注意:对于 iOS 应用程序,位码是默认设置,但可选。如果您提供位码,则应用程序包中的所有应用程序和框架都需要包含位码。对于 watchOS 应用,需要位码

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


“将来重新优化您的应用程序二进制文件” - 你能解释一下吗?
这里说:“Bitcode 是 iOS 9 的一项新功能”,并且“[...] 对于 watchOS 应用程序,bitcode 是必需的 [...]”。那么,如果我想在 iOS 8 下创建一个 WatchOS 应用呢?
A
Alexander Vasenin

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

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

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


在 9 月和 12 月之间,这设法通过新的 Xcode Organizer 导出选项得到修复(请参阅引用的 HA howto 中的更新)并再次损坏(请参阅我解决的 HA question
z
zszen

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

https://i.stack.imgur.com/SMmd6.png

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

https://i.stack.imgur.com/yvzTl.png


@Septronic 如果您想选择是。你需要检查你所有的第三个框架是否支持这个。
您的目标最低支持 iOS 版本必须是 iOS 6 或更高版本。
v
vj9

docs

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

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

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

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

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

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

不应有任何性能影响。


E
Erik Zivkovic

XCode 14 Beta 已弃用 Bitcode:

https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes

从 Xcode 14 开始,watchOS 和 tvOS 应用程序不再需要 bitcode,App Store 不再接受来自 Xcode 14 的 bitcode 提交。Xcode 不再默认构建 bitcode,如果项目明确启用 bitcode,则会生成警告消息:“Building不推荐使用带有位码的。请更新您的项目和/或目标设置以禁用位码。”使用 bitcode 构建的功能将在未来的 Xcode 版本中删除。包含位码的 IPA 将在提交到 App Store 之前去除位码。过去提交的位码的调试符号仍然可供下载。 (86118779)

对于任何想知道位码的人来说,似乎不再需要它了。


y
yoAlex5

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

是的

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

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

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

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

[Bitcode]