У меня есть приложение для iOS, и я хочу добавить большой кусок кода, который я разрабатывал, как еще один проект, просто для удобства тестирования. Новый блок в основном имеет дело с сохранением изображения в различных службах обмена и т. Д. Поскольку этот код совместного использования требует большого тестирования и будущего обновления, мне было интересно, как лучше всего включить этот фрагмент кода в мое существующее приложение.
Я не знаю, должна ли это быть статическая библиотека, динамическая библиотека или фреймворк, и, честно говоря, я не совсем уверен, в чем разница, или как мне это сделать и настроить в Xcode.
Все, что я знаю, - это то, что мне нужно / я хочу сохранить отдельное приложение для тестирования и обновления для общего кода и использовать его в основном приложении.
источник
Ответы:
Во-первых, некоторые общие определения (специфичные для 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 это может быть найдено в:
источник
Формат файла Mach-O (объект Mach -
.o
)В мире iOS каждый исходный файл преобразуется в объектные файлы - ABI [About] Mach-O file [About], который будет упакован в окончательный исполняемый пакет (например, приложение, инфраструктура ...), файл (например, библиотека ...) и это поведение определяется
Mach-O type
[О]Package
каталог, который ведет себя как файл -opaque file
. Он создан для удобства пользователя, чтобы усложнить внесение некоторых изменений во внутреннюю структуру, которые могут вызвать непредсказуемое поведение программы. Пакет используется вDocument Package
или сBundle
. Ты можешь использоватьShow Package Contents
в FinderBundle
каталог с определенной структурой для организации двоичного кода (исполняемый код) и ресурсов для этого кода (например, изображения, перья ...). Пакет содержит файлInfo.plist
[About] . Пакет был создан для разработчиков . Также это может быть упаковано. Существует несколько типов комплектов: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
(он же статическая архивная библиотека, статическая связанная общая библиотека [doc] ) - когда вы добавляете в приложение статический компоновщик во время компиляции объединит объектные файлы из библиотеки и упакует их вместе с объектными файлами приложения в один исполняемый файл. файл. Недостатком является большой выходной файлНачиная с Xcode 9.0, поддерживается статическая библиотека Swift.
Dynamic library
-.dylib
( так называемый динамический общей библиотеки разделяемый объект, динамически подключаемая библиотека [документ] ) является динамически связана с исполняемом приложения при загрузке или выполнения , но не копируется в него. На практике пакет приложения будет содержать папку Frameworks с.dylib
файлом. Все системные библиотеки iOS и macOS естьdynamic
. Недостатком является медленное время запуска, поскольку все динамические библиотеки должны быть скопированы и связаны.[Статическое и динамическое связывание]
Text-based stub library
-.tbd
[О программе] , это текстовая заглушкаdynamic library
, расположенная на целевом устройстве. В результате вы не должны упаковывать динамическую библиотеку в ваш пакет. Имеет размерный эффект.Framework
akabinary 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
[About] -@import
это фреймворк, который содержит.modulemap
файл внутри. Модуль может содержать подмодули. Основным преимуществом является то, что вы экономите время сборки сModular Framework
.Universal Library or Framework
(он же Fat) [lipo] [Aggregate target] содержит несколько архитектур. Например, ваша сборка релиза должна поддерживать некоторую арку, которую вы можете регулировать с помощьюBuild Active Architecture Only
[ONLY_ACTIVE_ARCH]Dependency
[О программе] Вы можете использовать сторонний код как часть вашей цели. Это позволяет вам повторно использовать код из множества источников, таких как - другой проект, проект в той же рабочей области, другая цель, библиотека, фреймворк и т. Д.Как создать и использовать статическую библиотеку:
Как построить и использовать динамический фреймворк [сменить на статический]
[Система сборки XCode]
[Компоненты XCode]
[Динамический компоновщик]
источник
Вы также можете создать файл .podspec для CocoaPods ( http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo ) и использовать его как любой другой модуль с Разница лишь в том, что это ваш личный модуль и он не виден внешнему миру (я не уверен, что произойдет, если ваш модуль создаст модель CoreData, но, как я понимаю, дело обстоит не так).
источник