Сопротивление iOS Static vs Dynamic frameworks
Я должен признать, что с выпуском iOS 8 я немного запутался по поводу динамических и статических фреймворков в iOS.
Я ищу способ распространения созданной мной библиотеки, и мне нужно поддерживать iOS 7 и выше. (Примечание: это будет частная структура. Я не могу использовать cocoa-стручки и не могу распространять источник). Вот что я уже знаю:
- iOS 8 представила "встроенные фреймворки" для iOS, но, как я понимаю, они не работают для iOS 7, только для iOS 8 и выше.
- У меня есть возможность распространять мою библиотеку как статическую библиотеку (файл .a), а также распределять заголовки. Я знаю, что это обычный способ справиться с ситуацией, но я хотел бы найти что-то более простое, чем это (а также связать с ним некоторые ресурсы, если это возможно).
- Я также обнаружил, что iOS 7 не поддерживает динамические библиотеки .framework (только статические), поскольку не поддерживает динамическое связывание. Но iOS 8, так же как и статические ссылки.
И вот мои вопросы относительно этой информации:
- Я увидел, что могу создать цель .framework и сделать ее статической, изменив тип Mach-O на "статическую библиотеку". Этого будет достаточно для поддержки iOS 7 без проблем, а также для распространения моей библиотеки как .framework bundle? Если так, почему "встроенные фреймворки" в iOS 8 так важны, как предлагают многие ресурсы в Интернете? Я что-то упустил?
- Необходимо ли кодировать .framework так же, как я делаю это с любым другим приложением, которое я создаю?
- Что, если мне нужно включить другие ресурсы (такие как Core Data или Images) в мой файл .framework? Нужно ли для этого создать отдельный файл .bundle?
Ответы
Ответ 1
До iOS8 Xcode разрешал создавать статические библиотеки для iOS. Общей проблемой было то, что нам приходилось отправлять двоичные файлы и заголовки отдельно.
Позже некоторые разработчики пришли к идее создания "статических фреймворков". [.framework - это просто папка с символическими ссылками на lib и заголовки]. Одним из таких примеров является https://github.com/jverkoey/iOS-Framework
Эта опция будет работать для iOS 7 или 8 или до этого. Потому что это просто статические библиотеки с удобством объединения файлов заголовков.
Что касается ваших вопросов о ресурсах, нам нужно будет их связать в ".bundle". Для доставки их я не уверен, можем ли мы заключить их в папку .framework. В прошлом я использовал для отправки мои библиотеки как статические рамки и пакет...
Однако приведенный выше вариант не будет работать для вас, если вы используете Swift. Xcode не поддерживает создание статических библиотек, которые содержат быстрый код.
Вы должны пойти с динамическими структурами, если есть быстрое использование. Теоретически, динамические структуры работают в iOS7. Но, я думаю, iTunes Connect отклонит, если приложение нацелено на iOS7 и использует динамические фреймворки: -).
Надеюсь, что это поможет
Ответ 2
С помощью Xcode 9 вы также можете создавать статические фреймворки для Swift. Это возможно из-за совместимости источника ABI. Все, что вам нужно сделать, это просто изменить Mach-O type
в настройках сборки целевой среды.
Этот метод также применим к Hybrid Frameworks (фреймворки с кодом Swift и Objective-C).
Ответ 3
Swift не работает в static lib. Если вам нужно использовать динамическую структуру, вы должны установить min iOS на 8.0 , потому что AppStore отклоняет ios 7 с динамической каркасом
Ответ 4
У меня нет всех ответов, но я постараюсь рассмотреть некоторые из ваших вопросов здесь.
-
Вы получите предупреждение об использовании этих фреймворков в iOS 7, однако все это предупреждение. См. Этот ответ.
-
Вы можете включить другие ресурсы, такие как CoreData, но вам нужно будет создать их в коде вручную. Здесь учебник, показывающий, как создать базовую модель данных.
-
Вам нужно закодировать знаковые динамические библиотеки для iOS.
-
Вам нужно убедиться, что ваша инфраструктура поддерживает как симулятор, так и архитектуры устройств, если вы планируете его распространять.
Ответ 5
Фреймворки - это библиотеки static
или dynamic
libraries, упакованные в пакет с некоторыми дополнительными ресурсами, мета-описанием для управления версиями и т.д.
Вы можете изменить формат библиотеки, который будет влиять на Linker
, изменив Framework target -> Build Settings -> Mach-O Type
[About] на Static Library
или Dynamic Library
. По умолчанию Xcode имеет значение Dynamic Library
.
В зависимости от этого параметра будут генерироваться различные типы двоичных файлов[check static or dynamic]
![]()
После успешной настройки потребителя[Link vs Embed]
Static Linker
ld: во время компиляции включит весь код из static library
в исполняемый объектный файл.
![]()
Dynamic Linker
dyld: во время загрузки/выполнения попытается найти встроенную среду, используя @rpath
[About], и связать ее
![]()