Библиотека? Статическая? Динамический? Или рамки? Проект внутри другого проекта
У меня есть приложение для iOS, и я хочу добавить большой кусок кода, который я разрабатывал, в качестве другого проекта только для простоты тестирования. Новый блок в основном имеет дело с сохранением изображения в различных службах обмена и т. Д. Поскольку этот код обмена требует много тестирования и последующего обновления, мне было интересно, как лучше всего включить этот фрагмент кода в мое существующее приложение.
Я не знаю, должна ли это быть статическая библиотека, динамическая библиотека или фреймворк, и, честно говоря, я не совсем уверена, в чем разница, или как мне это сделать и настроить ее в Xcode.
Все, что я знаю, - это то, что мне нужно / я хочу сохранить отдельное приложение для тестирования и обновления для общего кода и использовать его в основном приложении.
Если вы уже не можете сказать, я не мерзавец. Я просто один разработчик одного человека.
Любая помощь или направление будут оценены. Спасибо!
2 ответа
Во-первых, некоторые общие определения (специфичные для iOS):
Статическая библиотека - блок кода, связанный во время компиляции, который не изменяется.
Однако статические библиотеки iOS не могут содержать изображения / ресурсы (только код). Вы можете обойти эту проблему, используя медиа комплект.
Лучшее, более формальное определение можно найти в Википедии здесь.
Динамическая библиотека - блок кода и / или ресурсов, связанных во время выполнения, которые могут измениться.
Однако только Apple может создавать динамические библиотеки для iOS . Вам не разрешено создавать их, так как это приведет к отклонению вашего приложения. (См. Этот другой пост SO для подтверждения и обоснования такого).
Software Framework - это скомпилированный набор кода, который выполняет задачу... следовательно, вы можете иметь статический или динамический каркас, который обычно представляет собой просто скомпилированные версии выше.
Смотрите Wiki на Software Framework для получения более подробной информации.
Следовательно, на iOS единственным вариантом является использование статической библиотеки или статической среды (основное отличие состоит в том, что статическая структура распространяется как скомпилированная .a
файл чаще всего, тогда как статическая библиотека может быть просто включена в качестве подпроекта - вы можете увидеть весь код - который компилируется первым и его результат .a
файл, используемый проектом в качестве зависимости).
Теперь, когда мы прояснили эти условия, настройка статической библиотеки и поддержка мультимедийного комплекта для iOS не слишком сложны, и есть много учебных пособий о том, как это сделать. Я лично рекомендовал бы это:
https://github.com/jverkoey/iOS-Framework
Это довольно прямолинейное руководство, и у него нет недостатка в работе с "поддельными статическими библиотеками"... проверьте его для получения дополнительной информации...
После того как вы создали свою статическую библиотеку, ее так же просто, как включить ее в подмодуль в Git для использования в разных проектах.
Удачи.
РЕДАКТИРОВАТЬ
Что касается подпроекта в проекте, насколько я знаю, чтобы заставить его работать / компилироваться правильно, вам, по сути, нужно настроить цепочку компиляции, где подпроект компилируется первым, что создает статическую структуру .a
файл, используемый проектом в качестве зависимости.
Вот еще один полезный урок, который говорит об этом:
http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/
РЕДАКТИРОВАТЬ 2
Начиная с iOS 8, Apple теперь позволяет разработчикам создавать динамические фреймворки! (Примечание: ваше приложение должно иметь минимальную цель iOS 8 для включения динамической структуры... обратное портирование не допускается.)
Это было добавлено в качестве нового шаблона проекта. В Xcode 6.1 это может быть найдено в:
New Project -> iOS -> Framework & Library -> Cocoa Touch Framework
Формат файла Mach-O (Объект Mach - .o
)
В мире iOS каждый исходный файл конвертируется в объектные файлы - ABI [About] Mach-O file [About], который будет упакован в окончательный исполняемый пакет (например, приложение, фреймворк...), файл (например, библиотека...) и его поведение определяетсяMach-O type
[Около]
Package
это каталог, который ведет себя как файл - opaque file
. Он создан для удобства пользователей, чтобы усложнить внесение некоторых изменений во внутреннюю структуру, которые могут вызвать непредсказуемое поведение программы. Пакет используется вDocument Package
или с Bundle
. Вы можете использоватьShow Package Contents
в Finder
Bundle
- это каталог с определенной структурой для организации двоичного кода (исполняемого кода) и ресурсов для этого кода (например, изображений, перьев...). Пакет содержитInfo.plist
[О] файле. Пакет создан для удобства разработчиков. Также его можно упаковать. Есть несколько видов банд:
application bundle
-Application target
framework bundle
а такжеversioned bundle
как подтип -Framework Target
loadable bundle
(он жеplug-in bundle
) -Bundle target
(Пакет тестирования пользовательского интерфейса, Пакет модульного тестирования)- другие (
dSYM
[О пакете ])
Application
- .ipa
, .app
[О себе] -packaged
application bundle
- запускаемая программа.
Tests
- packaged
loadable bundle
который используется для тестирования двоичного файла. Архитектура плагина позволяет нам добавлять новую функциональность (тестовые примеры) как отдельный модуль в существующий двоичный файл.
Библиотеки и фреймворки
Мартин Фаулер о InversionOfControl
Библиотека - это, по сути, набор функций, которые вы можете вызывать, в наши дни обычно организованные в классы. Каждый вызов выполняет определенную работу и возвращает управление клиенту.
Фреймворк воплощает в себе некоторый абстрактный дизайн со встроенным дополнительным поведением. Чтобы использовать его, вам нужно вставить свое поведение в различные места фреймворка либо путем создания подклассов, либо путем подключения ваших собственных классов. Затем код фреймворка вызывает ваш код в этих точках. Основное управление программой перевернуто, от вас перенесено во фреймворк. (Инверсия контроля)
Библиотеки и фреймворки на iOS
Library
представляет собой набор объектных файлов Mach-O [проверьте статический или динамический], скомпилированный для одной или нескольких архитектур.
Static library
- .a
(также известная как статическая архивная библиотека, статическая связанная разделяемая библиотека [документ]). Когда вы добавляете ее в свое приложение, статический компоновщик во время компиляции объединит объектные файлы из библиотеки и упакует их вместе с объектными файлами приложения в один исполняемый файл.. Недостаток - большой выходной файл.
Начиная с Xcode 9.0, поддерживается статическая библиотека Swift.
Dynamic library
- .dylib
(также известная как динамическая общая библиотека, общий объект, динамически подключаемая библиотека [doc]) динамически связана с исполняемым файлом приложения при загрузке или во время выполнения, но не копируется в него. На практике пакет приложения будет содержать папку Frameworks с.dylib
файл. Все системные библиотеки iOS и macOSdynamic
. Недостатком является медленное время запуска, поскольку все динамические библиотеки должны быть скопированы и связаны.
[Статические и динамические ссылки]
Text-based stub library
- .tbd
[About], это текстовый фрагментdynamic library
который находится на целевом устройстве. В результате вам не следует упаковывать динамическую библиотеку в свой пакет. Имеет размерный эффект.
Framework
он же binary framework
- .framework
это not packaged framework bundle
(чтобы разработчики могли легко просматривать заголовки и ресурсы), который содержит скомпилированный static or dynamic
библиотека, файлы заголовков и ресурсы.
Static framework
содержать static library
упакован со своими ресурсами.
Dynamic framework
содержит dynamic library
и ресурсы. В дополнение к этому, динамический фреймворк может включать в себя разные версии одной и той же динамической библиотеки в одном пакете (versioned bundle
)
[Статическая и динамическая структура]
Embedded framework
это dynamic framework
который живет в песочнице приложения. Этот тип был создан в первую очередь для расширения, чтобы разделять общий код и ресурсы. Это доступно, если целью развертывания является iOS 8+.
Umbrella framework
[Агрегированная цель] - это структура, содержащая другие структуры. Официально он не поддерживается в iOS, поэтомуразработчикам не рекомендуется создавать их [Официальный документ]. На самом деле это набор суб-фреймворков (или вложенных фреймворков). Когда вы создаете фреймворк, у которого есть зависимость, потребитель (например, приложение) несет ответственность за добавление этой зависимости вместе с вашим фреймворком в проект. Для разработчика естественно попытаться найти способ передать эту обязанность с потребителя на вас. В результате вы думаете, чтоUmbrella framework
- это спасение, но обычно оно приводит к серьезным проблемам с управлением версиями и сложности его создания и поддержки.
Fake Framework
- является результатом определенных операций под static library
создать связку с .framework
расширение, которое будет вести себя как dynamic framework
. Этот прием использовался, когда Xcode не поддерживал создание фреймворка, так как не имел шаблона фреймворка. Одна из реализаций поддельного фреймворка. В Xcode 6 Apple добавила поддержку платформы iOS.
Modular Framework
[О себе] -@import
это структура, которая содержит .modulemap
файл внутри. Модуль может содержать подмодули. Основным преимуществом является то, что вы экономите время сборки с помощьюModular Framework
.
Universal Library or Framework
(он же Fat) [липо] [агрегатная цель] содержит несколько архитектур. Например, ваша сборка релиза должна поддерживать некоторую арку, которую вы можете регулировать с помощьюBuild Active Architecture Only
[ONLY_ACTIVE_ARCH]
Dependency
[О программе] Вы можете использовать сторонний код как часть своей цели. Он позволяет повторно использовать код из множества источников, таких как - другой проект, проект в той же рабочей области, другая цель, библиотека, фреймворк и т. Д.
Как создать и использовать статическую библиотеку:
- [Потребитель Swift -> Статическая библиотека Swift]
- [Swift потребитель -> Статическая библиотека Objective-C]
- [Потребитель Objective-C -> Статическая библиотека Swift]
- [Потребитель Objective-C -> Статическая библиотека Objective-C]
Как создать и использовать динамическую структуру [изменить на статическую]
- [Потребитель Swift -> Динамическая структура Swift]
- [Потребитель Swift -> Динамическая платформа Objective-C]
- [Потребитель Objective-C -> Динамическая структура Swift]
- [Потребитель Objective-C -> Динамическая структура Objective-C]
[Система сборки Xcode]
[Компоненты Xcode]
[Динамический компоновщик]
Библиотеки и рамки
Мартин Фаулер на InversionOfControl
library
по сути, это набор функций, которые вы можете вызывать, в наши дни обычно организованные в классы. Каждый вызов выполняет некоторую работу и возвращает управление клиенту.
framework
воплощает в себе некоторый абстрактный дизайн, с большим количеством встроенного поведения. Чтобы использовать его, вам нужно вставить свое поведение в различные места в фреймворке либо путем создания подклассов, либо путем подключения ваших собственных классов. Код платформы затем вызывает ваш код в этих точках.
Библиотеки и фреймворки на iOS
library
представляет собой набор ресурсов и сам код, скомпилированный для одной или нескольких архитектур. Это состоит из *.o
файлы (объектные файлы Mach-O).
В случае static libraries (*.a)
код, который использует приложение, копируется в сгенерированный исполняемый файл static linker
в течение compilation time
,
Начиная с Xcode 9.0, теперь поддерживаются статические библиотеки Swift.
✓ Плюсы:
- Статические библиотеки гарантированно присутствуют в приложении и имеют правильную версию.
- Не нужно держать приложение в курсе обновлений библиотеки.
- Лучшая производительность библиотечных звонков.
✕ Минусы:
- Завышенный размер приложения.
- Время запуска ухудшается из-за раздутого исполняемого файла приложения.
- Необходимо скопировать всю библиотеку, даже если используется одна функция.
Dynamic libraries (*.dylib)
отличаются от static libraries
в том смысле, что они динамически связаны с исполняемым файлом приложения в load
или же runtime
, но не копируется в него. В результате исполняемый файл становится меньше и, поскольку код загружается только тогда, когда это необходимо, время запуска обычно быстрее.
Все системные библиотеки iOS и macOS являются динамическими. Следовательно, наши приложения выиграют от будущих улучшений, которые Apple внесет в стандартные библиотечные фреймворки без создания и доставки новых сборок.
✓ Плюсы:
- Может извлечь выгоду из улучшений библиотеки без перекомпиляции приложения. Особенно полезно с системными библиотеками.
- Занимает меньше места на диске, так как он распределяется между приложениями.
- Более быстрое время запуска, поскольку оно загружается по требованию во время выполнения.
- Загружен по частям: нет необходимости загружать всю библиотеку, если используется одна функция.
✕ Минусы:
- Потенциально может сломать программу, если что-то изменится в библиотеке.
- Более медленные вызовы библиотечных функций, так как они находятся вне исполняемого файла приложения.
bundle
каталог файлов с подкаталогами внутри На iOS bundles
служат для удобной отправки связанных файлов в одном пакете - например, изображений, перьев или скомпилированного кода. Система обрабатывает его как один файл, и вы можете получить доступ к ресурсам пакета, не зная его внутренней структуры.
library
также могут иметь дополнительные ресурсы: заголовки, файлы локализации, изображения, документацию и примеры использования. Мы можем объединить все это в один bundle
- и имя это framework
,
framework (*.framework)
это особый вид bundle
, С небольшими изменениями в его структуре, он может даже содержать другие структуры. Такой агрегат известен как umbrella framework
,
Static frameworks
содержать static library
упаковано с его ресурсами.
Dynamic frameworks
содержать dynamic library
с его ресурсами. В дополнение к этому, dynamic frameworks
может удобно включать разные версии одного и того же dynamic library
в тех же рамках!
Если ваша цель развертывания - iOS8+, вы также можете создать embedded framework
,
Embedded framework
это Dynamic framework
и помещается в изолированную программную среду приложения и доступны только для этого приложения. Этот тип был создан в первую очередь для расширения для совместного использования общего кода и ресурсов.
Источник и еще один. Также читайте больше здесь, здесь, здесь, здесь, здесь
Вы также можете создать файл.podspec для CocoaPods ( http://guides.cocoapods.org/making/private-cocoapods.html) и использовать его как любой другой модуль с Разница лишь в том, что это ваш личный модуль и он не виден внешнему миру (я не уверен, что произойдет, если ваш модуль создаст модель CoreData, но, как я понимаю, дело обстоит не так).