Разъяснения iOS Static vs Dynamic Framework

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

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

  • 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?

4 ответа

Решение

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

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

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

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

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

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

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

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

Каркасы могут быть 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] и свяжите его

[Запас слов]

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

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

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

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

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

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

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

Другие вопросы по тегам