以静态或动态方式链接 Firebase 依赖项

从 CocoaPods 1.9.0 和 Firebase 7 开始,您可以选择将 Firebase 依赖项构建为静态框架还是动态框架。我们建议您使用静态框架,除非您需要某些动态库行为。

请注意,即使是使用 CocoaPods 1.9.0 及更高版本,在 GitHub 外开发的库也只能以静态方式链接。目前,此库列表包含 AdMobAnalyticsFirebase MLPerformance Monitoring。其他所有分发渠道(包括 ZIP 文件、Swift Package Manager 和 Cartage)仅提供静态链接的库。

本文档假定您具备 Apple 平台的动态链接和静态链接的实际运用知识。如果您不熟悉这些概念,请参阅以下文档:

由于本文档涉及的是库链接类型,而并未涉及加载不可执行的资源包,因此“库”和“框架”这两个术语通常可互换使用。

静态链接

静态链接的库在构建时会捆绑到应用可执行文件中。因此,当应用启动时,静态库中的对象文件会出现在应用中,且无需在应用启动时由动态链接器解析。因此,使用静态链接的应用启动速度更快。与此同时,二进制文件/应用可执行文件将会略大一些。需要注意的是,虽然可执行文件略大一些,但是不含捆绑动态库。

您可以通过在 Podfile 中明确指定链接类型来强制以静态方式链接 Firebase 依赖项:

# cocoapods >= 1.9.0
use_frameworks! :linkage => :static

动态链接

动态链接的库与应用的主可执行文件在 App Bundle 中分开存储,且在应用启动时必须由动态链接器加载。Apple 的所有框架都以动态方式链接,以支持在进程之间共享代码;同样,您也可以使用动态框架在应用和扩展程序目标之间共享代码。即使应用由同一开发者签名,您也无法在单独的应用之间共享动态框架。

如果要将 Firebase 用作动态框架目标的依赖项,则还需要以动态方式链接 Firebase;否则,您将在应用的运行时中遇到类定义重复问题。动态链接是 use_frameworks! 的默认行为,但您仍然可以在 Podfile 中明确指定动态链接:

# cocoapods >= 1.9.0
use_frameworks! :linkage => :dynamic

请注意,动态链接可能会增加应用的启动时间,尤其是当应用存在大量依赖项时。