昨天我发现了大量关于parse.com库的警告:
紧急:所有位码将被丢弃,因为'[path]/Parse.framework/Parse(pfanalysis .o)'是没有位码构建的。你必须通过启用bitcode (Xcode设置ENABLE_BITCODE)重新构建它,从供应商那里获得一个更新的库,或者禁用这个目标的bitcode。注意:这将是未来的一个错误。
我知道我可以用这个答案消除这些警告,但现在我想知道它是否会对AppStore提交和/或应用的实际性能产生任何负面影响。
Xcode会通知你有关比特码的信息
激活此设置表明目标或项目应该在编译过程中为支持它的平台和体系结构生成位码。对于存档构建,位代码将在链接二进制文件中生成,以便提交到应用程序商店。对于其他构建,编译器和链接器将检查代码是否符合位码生成的要求,但不会生成实际的位码。(ENABLE_BITCODE)
但我并没有从这篇文章中得到任何真正有用的信息。
我可以使用链接的答案来规避这个问题,而不产生任何负面影响,也不会影响未来的AppStore提交吗?
ENABLE_BITCODE实际上是做什么的,将来它会是一个非可选的需求吗?
如果我启用/禁用它会对性能有任何影响吗?
比特码是iOS 9的新功能
Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the App Store. Including bitcode will allow Apple to re-optimize your app binary in the future without the need to submit a new version of your app to the store.
Note: For iOS apps, bitcode is the default, but optional. If you provide bitcode, all apps and frameworks in the app bundle need to include bitcode. For watchOS apps, bitcode is required
所以你应该禁用位码,直到你的应用程序的所有框架都启用位码。
来自文档
我是否可以在不影响未来appstore提交的情况下使用上述方法?
比特码将允许苹果优化应用程序,而不必提交另一个构建。但是,只有当应用程序包中的所有框架和应用程序都启用了此功能时,您才能启用此功能。
拥有它会有帮助,但没有它不应该有任何负面影响。
ENABLE_BITCODE实际上是做什么的,将来它会是一个非可选的需求吗?
对于iOS应用程序,bitcode是默认值,但可选。如果你提供
Bitcode,应用程序包中的所有应用程序和框架都需要包含
bitcode。对于watchOS应用程序,位码是必需的。
如果我启用/禁用它会对性能有任何影响吗?
App Store和操作系统优化iOS的安装
和watchOS应用程序通过定制应用程序交付的能力
用户的特定设备,以最小的足迹。这种优化,
所谓的应用程序细化,让你创建的应用程序使用最多的设备
特性,占用最小的磁盘空间,并适应未来的更新
可以被苹果应用。更快的下载和更多的空间
其他应用程序和内容提供了更好的用户体验。
不应该有任何性能影响。
ENABLE_BITCODE实际上是做什么的,将来它会是一个非可选的需求吗?
我不知道你在寻找什么样的答案,所以让我们来一次小旅行。其中一些你可能已经知道了。
当你构建你的项目时,Xcode为Objective-C目标调用clang,为swift目标调用swift/swiftc。这两个编译器都将应用程序编译为中间表示(IR),其中一个IR是位码。从这个IR中,一个名为LLVM的程序接管并创建x86 32和64位模式(用于模拟器)和arm6/arm7/arm7s/arm64(用于设备)所需的二进制文件。通常,所有这些不同的二进制文件都集中在一个称为胖二进制文件的单个文件中。
ENABLE_BITCODE选项省略了最后一步。它创建了一个版本的应用程序与IR位码二进制。它有许多不错的特性,但有一个巨大的缺点:它不能在任何地方运行。为了让应用程序运行位码二进制,位码需要重新编译(可能是组装或转码……我不确定正确的动词)到x86或ARM二进制。
当一个位码应用程序被提交到应用程序商店时,苹果将执行最后一步并创建完成的二进制文件。
目前,位码应用程序是可选的,但历史表明苹果将可选的东西变成了要求(比如64位支持)。这通常需要几年的时间,所以第三方开发人员(如Parse)有时间进行更新。
我是否可以在不影响未来appstore提交的情况下使用上述方法?
是的,你可以关闭ENABLE_BITCODE,一切都将像以前一样工作。在苹果将位码应用程序作为应用程序商店的要求之前,你会没事的。
如果我启用/禁用它会对性能有任何影响吗?
启用它永远不会对性能产生负面影响,但用于测试的应用程序的内部分发可能会变得更加复杂。
至于积极的影响,这很复杂。
为了在App Store中发行,苹果将针对不同的机器架构(arm6/arm7/arm7s/arm64)为你的应用创建不同的版本,而不是一个带有臃肿二进制文件的应用。这意味着安装在iOS设备上的应用程序将更小。
此外,当位码被重新编译时(可能是组装或转码……同样,我不确定正确的动词),它是优化的。LLVM一直致力于创造新的更好的优化。从理论上讲,应用商店可以在每一个新的LLVM版本中重新创建应用程序的单独版本,所以你的应用程序可以使用最新的LLVM技术进行重新优化。
XCode 14 Beta版已弃用Bitcode:
https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes
Starting with Xcode 14, bitcode is no longer required for watchOS and tvOS applications, and the App Store no longer accepts bitcode submissions from Xcode 14.
Xcode no longer builds bitcode by default and generates a warning message if a project explicitly enables bitcode: “Building with bitcode is deprecated. Please update your project and/or target settings to disable bitcode.” The capability to build with bitcode will be removed in a future Xcode release. IPAs that contain bitcode will have the bitcode stripped before being submitted to the App Store. Debug symbols for past bitcode submissions remain available for download. (86118779)
对于任何想了解比特码的人来说,比特码似乎不再是必要的了。