Начиная с CocoaPods 1.9.0 и Firebase 7, вы можете выбрать, будут ли ваши зависимости Firebase собираться как статические или динамические фреймворки. Мы рекомендуем использовать статические фреймворки, если вам не требуется определенное поведение динамических библиотек.
Обратите внимание, что библиотеки, разработанные вне GitHub, могут быть связаны только статически, даже в CocoaPods 1.9.0 и более поздних версиях. В настоящее время этот список библиотек включает AdMob , Analytics , Firebase ML и Performance Monitoring . Все остальные каналы распространения, включая zip-архив, Swift Package Manager и Carthage, предоставляют только статически связанные библиотеки.
Данный документ предполагает наличие базовых знаний о динамической и статической компоновке на платформах Apple. Если вы не знакомы с этими понятиями, ознакомьтесь со следующей документацией:
- Темы программирования Mach-O
- Темы программирования динамических библиотек
- Использование Firebase в библиотеках
Поскольку данный документ посвящен типам связывания библиотек, а не загрузке неисполняемых пакетов ресурсов, термины «библиотека» и «фреймворк» используются взаимозаменяемо.
Статическая ссылка
Статически скомпилированные библиотеки включаются в исполняемый файл вашего приложения во время сборки. В результате объектные файлы статической библиотеки будут присутствовать в вашем приложении при его запуске и не потребуют разрешения динамическим компоновщиком во время запуска приложения. Следовательно, приложения, использующие статическую компоновку, будут запускаться быстрее. Это происходит за счет немного большего размера исполняемого файла/бинарного файла приложения, хотя следует отметить, что больший размер исполняемого файла будет компенсирован отсутствием включенных динамических библиотек.
Вы можете принудительно установить статическую привязку к зависимостям Firebase, явно указав соответствующую привязку в вашем Podfile:
# cocoapods >= 1.9.0
use_frameworks! :linkage => :static
Динамическая компоновка
Динамически скомпилированные библиотеки хранятся в пакете вашего приложения отдельно от основного исполняемого файла приложения, и они должны быть загружены динамическим компоновщиком во время запуска приложения. Все фреймворки Apple динамически скомпилированы для обеспечения совместного использования кода между процессами; аналогично, вы можете использовать динамические фреймворки для совместного использования кода между вашим приложением и целевыми объектами расширения. Вы не можете совместно использовать динамические фреймворки между отдельными приложениями, даже если они оба подписаны одним и тем же разработчиком.
Если вы хотите использовать Firebase в качестве зависимости для динамического фреймворка, вам также необходимо динамически связать Firebase; в противном случае вы столкнетесь с дублирующимися определениями классов во время выполнения вашего приложения. Динамическая связь является поведением по умолчанию при use_frameworks! но вы все еще можете явно указать динамическую связь в вашем Podfile:
# cocoapods >= 1.9.0
use_frameworks! :linkage => :dynamic
Обратите внимание, что динамическая компоновка может увеличить время запуска вашего приложения, особенно если у него много зависимостей.