Сопротивление 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], и связать ее