Как связать зависимости Firebase статически или динамически

Начиная с CocoaPods 1.9.0 и Firebase 7, вы можете выбрать, как будут создаваться зависимости Firebase: как статические или динамические фреймворки. Мы рекомендуем использовать статические фреймворки, если вам не нужны определенные функции динамических библиотек.

Обратите внимание, что библиотеки, разработанные вне GitHub, можно связать только статически, даже если вы используете CocoaPods 1.9.0 или более позднюю версию. В настоящее время в список библиотек входят AdMob, Analytics, Firebase ML и Performance Monitoring. Все остальные каналы распространения, в том числе ZIP-файл, Swift Package Manager и Carthage, предоставляют только библиотеки со статической компоновкой.

В этом документе предполагается, что у вас есть опыт работы с динамическими и статическими ссылками на платформах Apple. Если вы не знакомы с этими понятиями, ознакомьтесь со следующими документами:

Поскольку в этом документе рассматриваются типы связывания библиотек, а не загрузка неисполняемых пакетов ресурсов, термины библиотека и фреймворк используются как взаимозаменяемые.

Статическая компоновка

Библиотеки со статической компоновкой объединяются с исполняемым файлом приложения во время сборки. В результате объектные файлы из статической библиотеки будут присутствовать в приложении при его запуске и не потребуют разрешения динамическим компоновщиком. В результате приложения, использующие статическую компоновку, будут запускаться быстрее. Это приводит к незначительному увеличению размера исполняемого файла приложения, однако следует отметить, что отсутствие динамических библиотек компенсирует это увеличение.

Вы можете принудительно установить статическую связь зависимостей Firebase, явно указав ее в файле Podfile:

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

Динамическая связь

Библиотеки с динамической компоновкой хранятся в наборе App Bundle отдельно от основного исполняемого файла и должны быть загружены динамическим компоновщиком при запуске приложения. Все фреймворки Apple динамически связаны, чтобы обеспечить возможность совместного использования кода между процессами. Аналогичным образом вы можете использовать динамические фреймворки, чтобы совместно использовать код между приложением и целевыми расширениями. Динамические фреймворки нельзя использовать в разных приложениях, даже если они подписаны одним и тем же разработчиком.

Если вы хотите использовать Firebase в качестве зависимости целевого фреймворка, вам также нужно связать Firebase динамически. В противном случае во время выполнения приложения возникнет ошибка дублирования определений классов. Динамическая связь используется по умолчанию с use_frameworks!, но вы можете явно указать ее в файле Podfile:

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

Обратите внимание, что динамическая компоновка может увеличить время запуска приложения, особенно если у него много зависимостей.