Почему мы используем use_frameworks в CocoaPods?

108

Я много раз использовал use_frameworksв CocoaPods Podfile. Мне просто интересно, почему мы его используем? Я не мог получить на него прямого ответа.

Пример:

platform :ios, '8.0'
use_frameworks!

target "CityWhether" do
    pod 'Alamofire'
    pod 'SwiftyJSON'
end
харикриста
источник
1
Вы имеете в виду use_frameworks! С восклицательным знаком? С тех пор меня это всегда смущало! значит НЕ.
Габриэль Дженсен

Ответы:

121

use_frameworksсообщает CocoaPods, что вы хотите использовать Frameworks вместо статических библиотек. Поскольку Swift не поддерживает статические библиотеки, вам необходимо использовать фреймворки.


В другом ответе я объяснил различия между статическими библиотеками и фреймворками:

Какао Touch Frameworks

Они всегда с открытым исходным кодом и будут построены так же, как ваше приложение. (Таким образом, Xcode иногда компилирует его при запуске приложения и всегда после очистки проекта.) Фреймворки поддерживают только iOS 8 и новее, но вы можете использовать Swift и Objective-C в рамках.

Статические библиотеки Cocoa Touch

Как следует из названия, они статичны. Итак, они уже скомпилированы, когда вы импортируете их в свой проект. Вы можете поделиться ими с другими, не показывая им свой код. Обратите внимание, что статические библиотеки в настоящее время не поддерживают Swift. Вам нужно будет использовать Objective-C в библиотеке. Само приложение все еще можно написать на Swift.

Источники: Другой мой ответ | Блог AddThis.com

FelixSFD
источник
3
Длинный рассказ о примечаниях к выпуску blog.cocoapods.org/CocoaPods-0.36
Хайме Агудо
7
статические библиотеки теперь поддерживают Swift с Xcode 9 beta 4 - CocoaPods обновляется для поддержки этого, см. github.com/CocoaPods/CocoaPods/issues/6899
JosephH
Сортировочное и сладкое описание. Это действительно полезно
Пиюш
76

use_frameworks!указывает какао-стручкам использовать динамические библиотеки, и в какой-то момент это было очень распространено, в частности, из-за того, что swift не поддерживал статические библиотеки, что означает, что выбора не было - однако вам часто больше не нужно use_frameworks!.

Начиная с Xcode 9 beta 4 и CocoaPods 1.5.0, теперь поддерживаются статические библиотеки swift. Основное преимущество - более быстрое время запуска приложения, особенно если у вас много подов - iOS 10 и 11 не самые быстрые, когда у вас много дилибов.

CocoaPods 1.5.0 был выпущен в начале апреля 2018 года , так что вам , возможно , потребуется обновить , чтобы получить его: sudo gem install cocoapods.

Я нашел несколько модулей, которые пока не работают со статическими библиотеками, поэтому ваш опыт может отличаться.

JosephH
источник
2
Я сделал это, а затем столкнулся с теми же No such moduleошибками. Это проблема тех коконожек?
Alper
3
Мне пришлось добавить use_modular_headers!в свой Podfile, чтобы он работал с модулями, которые предположительно требуют этого, но пока не включаются сами по себе.
Адриан
4
@JosephH «Главное преимущество - более быстрое время запуска приложения». Похоже, это противоречит документации Apple Dynamic Library, которая утверждает то же самое, что и dll: «минимизация использования памяти после запуска делает запуск приложения быстрее». Означает ли это, что DLL приведет к более быстрому запуску, если используемая библиотека не требуется во время запуска, или это популярная библиотека и, следовательно, уже загружена в память?
TolkienWASP
3
@TolkienWASP Кажется, эта страница посвящена macOS, а не iOS. Но, да, если DLL не будет загружена до момента запуска, то DLL будет победой. К сожалению, в случае с iOS в ситуациях, которые я видел, все библиотеки DLL загружаются до того, как приложение завершает запуск, так что это замедляет работу. Есть по крайней мере один доклад WWDC на тему оптимизации времени запуска приложения iOS, и в нем явно упоминается что-то вроде проверки того, что у вас не более 3 или 4 dll.
JosephH
1
Я думаю, что это видео, указанное выше: developer.apple.com/videos/play/wwdc2016/406 Я бы посоветовал вам использовать переменную среды DYLD_PRINT_STATISTICS, чтобы измерить скорость запуска вашего приложения и посмотреть, что лучше для вас.
iMacHumphries,
2

use_frameworksзаявляет, что вы хотите использовать динамические фреймворки вместо статических библиотек .

С выпущенными Xcode 9.0 и CocoaPods 1.5.0 вы можете использовать статические библиотеки с swift, если вы не используете use_frameworks.

Одна из проблем use_frameworksзаключается в том, что все ваши фреймворки в Pods / Products являются фреймворками.

Вот соответствующая статья: Базовый обзор статических и динамических фреймворков на ios

Mistdon
источник
4
> One performance with use_frameworks is that all your framework in Pods/Products is frameworks. Один спектакль какой?
Alex Zavatone
2

[About] Cocoapod use_frameworks!отвечает за тип двоичного файла :

  • если use_frameworks!это присутствует -dynamic framework
  • если use_frameworks!это нет -static library

use_frameworks!имеет отражение в Mach-O Type[О программе] в соответствующей цели Podsпроекта.

Лента новостей:

  1. CocoaPods 0,36 введены , use_frameworks!которые вы должны были использовать для Swift стручка
  2. CocoaPods 1.5.0 и Xcode 9 позволили вам иметь выбор

[Словарь]

yoAlex5
источник
-1

Добавление

use_frameworks!

в Podfile означает, что мы хотим, чтобы перечисленные фреймворки устанавливались динамически, а не как статические.

Кьяра
источник
Спасибо, но расскажите подробнее о динамической и статической установке.
BuffK