Начиная с 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, явно указав привязку в вашем подфайле:
# cocoapods >= 1.9.0
use_frameworks! :linkage => :static
Динамическое связывание
Динамически связанные библиотеки хранятся в вашем комплекте приложений отдельно от основного исполняемого файла вашего приложения, и они должны быть загружены динамическим компоновщиком во время запуска приложения. Все платформы Apple динамически связаны, чтобы обеспечить совместное использование кода между процессами; аналогичным образом вы можете использовать динамические платформы для совместного использования кода между вашим приложением и целями расширения. Вы не можете совместно использовать динамические фреймворки между отдельными приложениями, даже если они оба подписаны одним и тем же разработчиком.
Если вы хотите использовать Firebase в качестве зависимости от цели динамической платформы, вам также необходимо динамически связать Firebase; в противном случае вы столкнетесь с повторяющимися определениями классов во время выполнения вашего приложения. Динамическое связывание — это поведение по умолчанию с use_frameworks!
, но вы все равно можете явно указать динамическую связь в своем подфайле:
# cocoapods >= 1.9.0
use_frameworks! :linkage => :dynamic
Обратите внимание, что динамическое связывание может увеличить время запуска вашего приложения, особенно если ваше приложение имеет много зависимостей.