Статические и динамические фреймворки iOS: пояснения

115

Я должен признать, что с выпуском iOS 8 я немного запутался в динамических и статических фреймворках в iOS.

Я ищу способ распространять созданную мной библиотеку, и мне нужно поддерживать iOS 7 и выше. (Примечание: это будет проприетарный фреймворк. Я не могу использовать какао-стручки, и я также не могу распространять исходный код). Вот что я уже знаю:

  • iOS 8 представила «встроенные фреймворки» для iOS, но, насколько я понимаю, они не работают для iOS 7, только для iOS 8 и выше.
  • У меня есть возможность распространять свою библиотеку как статическую библиотеку (файл .a), а также распространять заголовки. Я знаю, что это обычный способ справиться с ситуацией, но я хотел бы найти что-то попроще (а также связать с ним некоторые ресурсы, если возможно).
  • Я также обнаружил, что iOS 7 не поддерживает динамические библиотеки .framework (только статические), потому что не поддерживает динамическое связывание. Но iOS 8 делает, как и статическое связывание.

И вот мои вопросы по этой информации:

  • Я увидел, что могу создать цель .framework и сделать ее статической, изменив тип Mach-O на «статическая библиотека». Этого было бы достаточно для поддержки iOS 7 без каких-либо проблем, а также для распространения моей библиотеки как Пакет .framework? Если да, то почему «встроенные фреймворки» в iOS 8 так важны, как предлагают многие ресурсы в Интернете? Я что-то упускаю?
  • Нужно ли кодировать .framework так же, как я делаю это с любым другим приложением, которое я делаю?
  • Что делать, если мне нужно включить другие ресурсы (например, основные данные или изображения) в мой файл .framework? Нужно ли мне делать для этого отдельный файл .bundle?
csotiriou
источник
1
«iOS 7 не поддерживает библиотеки .framework, потому что не поддерживает динамическое связывание». Это утверждение неверно.
Midhun MP
1
Понимаю. ты можешь сказать мне правильное предложение? Это неверно, потому что iOS 7 поддерживает динамическое связывание или потому что iOS 7 поддерживает библиотеки .framework? Или оба?
csotiriou
1
Remeber AVFoundation и CoreGraphics - все это .framework. Наверное, это поможет вам найти ответы на все ваши вопросы: raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP
Я исправил приговор. Я уже прочитал ссылку, прежде чем опубликовать свои вопросы. Эта ссылка ничего не объясняет по моим вопросам. Он начинается со статической библиотеки и ВРУЧНУЮ упаковывает ее в файл .framework. Я говорю о цели Cocoa Touch Framework в Xcode 6, а затем меняю тип на статическую библиотеку. В нем не упоминается подписание кода (зачем и если это необходимо), дополнительные ресурсы и т. Д.
csotiriou
1
Вы можете использовать CocoaPods для распространения проприетарного фреймворка (например, Parse)
Рик Сантос,

Ответы:

69

До iOS8 Xcode позволял создавать только статические библиотеки для iOS. Общая проблема заключалась в том, что нам приходилось отправлять двоичный файл и заголовки отдельно.

Позже некоторым разработчикам пришла в голову идея создания «статических фреймворков». [.framework - это просто папка с символическими ссылками на библиотеку и заголовки]. Один из таких примеров - https://github.com/jverkoey/iOS-Framework.

Эта опция будет работать для iOS 7 или 8 или более ранних версий. Потому что это просто статические библиотеки с удобством объединения файлов заголовков.

Что касается ваших вопросов о ресурсах, нам нужно будет объединить их в '.bundle' .. Для отправки я не уверен, сможем ли мы вложить их в папку .framework .. Раньше я отправлял свои библиотеки как статическая структура и связка ...

Однако указанный выше вариант не сработает, если вы используете Swift. Xcode не поддерживает создание статических библиотек, включающих быстрый код.

Вы должны использовать динамические фреймворки, если они используются быстро. Теоретически динамические фреймворки работают в iOS7 .. Но я думаю, что iTunes Connect отклонит, если приложение нацелено на iOS7 и использует динамические фреймворки :-).

Надеюсь это поможет

Subbu
источник
17

Начиная с Xcode 9, вы также можете создавать статические фреймворки для Swift. Это возможно благодаря совместимости исходного кода ABI. Все, что вам нужно сделать, это просто изменить Mach-O typeнастройки сборки целевой платформы. Этот метод также применим к гибридным фреймворкам (фреймворкам с кодом Swift и Objective-C).

Авиджит Датта
источник
Отличный совет. Не знаю, почему этот ответ был опущен, поскольку он мне помог. \ Target'Build Settings \ Mach-O-Type и выберите Static Framework.
rustyMagnet
3
Совместимость с Abi недоступна в
Swift
8

static или dynamic в названии обычно указывает на тип Linking[About]

Каркасы могут быть static или dynamic[Отметьте статический или динамический]

Вы можете изменить формат библиотеки, которая повлияет на вас Linker, изменив Framework target -> Build Settings -> Mach-O Type[О программе] на Static Libraryили Dynamic Library. По умолчанию Xcode имеетDynamic Library значение.

В зависимости от этого параметра будут созданы разные типы двоичных файлов.

После успешной настройки потребителя [Link vs Embed]

Static Linker ld : во время компиляции будет включать весь код из static libraryфайла в исполняемый объектный файл.

Dynamic Linker dyld : во время загрузки / выполнения попытается найти встроенный фреймворк с помощью @rpath[About] и связать его

[Словарь]

yoAlex5
источник
5

У меня нет ответов на все, но я постараюсь ответить на некоторые из ваших вопросов здесь.

  • Вы получите предупреждение об использовании этих фреймворков в iOS 7, но это все, предупреждение. Смотрите этот ответ .

  • Вы можете включить другие ресурсы, такие как CoreData, однако вам нужно будет создать их в коде вручную. Вот руководство, показывающее, как создать базовую модель данных.

  • Вы должны написать код динамических библиотек для iOS.

  • Вы должны убедиться, что ваша платформа поддерживает архитектуры симуляторов и устройств, если вы планируете ее распространять.

Beau Nouvelle
источник
5

Swift не работает в статической библиотеке. Если вам нужно использовать динамическую структуру, вы должны установить минимальную iOS на 8.0, потому что AppStore отклоняет ios 7 с динамической структурой.

AliasCocoa
источник
1
Вы можете импортировать статическую библиотеку в проект на основе
Swift