Библиотека? Статическая? Динамический? Или рамки? Проект внутри другого проекта

151

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

Я не знаю, должна ли это быть статическая библиотека, динамическая библиотека или фреймворк, и, честно говоря, я не совсем уверен, в чем разница, или как мне это сделать и настроить в Xcode.

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

pizzafilms
источник
Вы можете создать зонтичный фреймворк, похожий на «фреймворк внутри фреймворка» stackoverflow.com/a/27638841/1582217
Мохд Ифтехар Кураши,
Возможный дубликат Как создать фреймворк Umbrella в iOS SDK?
Мохд Ифтехар Кураши

Ответы:

204

Во-первых, некоторые общие определения (специфичные для 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
JRG-разработчик
источник
Пока что кажется, что я хочу подпроект, и эта статья была идеальной. Я заметил один странный побочный эффект: у подпроекта, который я перетащил в свой основной проект, также есть мой тестовый код (viewcontroller и nib, appdelegate и т. Д.), И я убедился, что только те классы, которые я хочу использовать в Основной проект проверен для использования в статической библиотеке. Но по какой-то причине, когда я пошел прикреплять к nib-файлу моего основного проекта, в нем также отображались выходы и действия из моего подпроекта. Это может определенно привести к некоторой путанице. Любые советы, чтобы избавиться от них? Спасибо!
pizzafilms
Можно ли перетаскивать динамический проект в статический проект, что делает его статическим? Я действительно запутался, некоторые разъяснения были бы действительно великолепны! Заранее спасибо :-)
Равиндранат Акила
1
@ JRG-Developer Обратное портирование динамической среды разрешено, если вы следуете некоторым правилам: developer.apple.com/library/prerelease/ios/documentation/…
klefevre
Можно ли установить более низкую минимальную цель и сделать библиотеку необязательной?
kukudas
1. Можете ли вы включить некоторые известные примеры статической библиотеки, динамической библиотеки, фреймворка? 2. Можете ли вы привести примеры того, где вам нужно сделать это? 3. Любопытно, в чем разница между модулем и статической библиотекой?
Дорогой
30

Формат файла 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[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, расположенная на целевом устройстве. В результате вы не должны упаковывать динамическую библиотеку в ваш пакет. Имеет размерный эффект.

Frameworkaka 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[About] -@importэто фреймворк, который содержит.modulemapфайл внутри. Модуль может содержать подмодули. Основным преимуществом является то, что вы экономите время сборки сModular Framework.

Universal Library or Framework(он же Fat) [lipo] [Aggregate target] содержит несколько архитектур. Например, ваша сборка релиза должна поддерживать некоторую арку, которую вы можете регулировать с помощью Build Active Architecture Only [ONLY_ACTIVE_ARCH]

Dependency[О программе] Вы можете использовать сторонний код как часть вашей цели. Это позволяет вам повторно использовать код из множества источников, таких как - другой проект, проект в той же рабочей области, другая цель, библиотека, фреймворк и т. Д.

Как создать и использовать статическую библиотеку:

Как построить и использовать динамический фреймворк [сменить на статический]

[Система сборки XCode]
[Компоненты XCode]
[Динамический компоновщик]

yoAlex5
источник
1
Во многих руководствах по Swift упоминалось, что Objective C не поддерживает динамические библиотеки, где, как поддерживает swift, [ altexsoft.com/blog/engineering/… ] Но, как я знаю, OS8 и выше Objctive C поддерживает динамическую библиотеку. Не могли бы вы прояснить это?
Пратима
@pratima, вы можете создать динамический фреймворк на Objective-C для iOS
yoAlex5
1
«Статическая структура содержит статическую библиотеку, упакованную с ее ресурсами». Откуда появилось это определение? AFAK, фаза сборки статического фреймворка «Copy Bundle Resources» не работает, как статическая библиотека. В чем разница между статической структурой и статической библиотекой?
toshi0383
@ toshi0383 Вы нашли способ объединить статическую библиотеку (.a) и ее ресурсы (.bundle) в единую инфраструктуру, которую мы можем распространять среди потребителей?
user121095
2

Вы также можете создать файл .podspec для CocoaPods ( http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo ) и использовать его как любой другой модуль с Разница лишь в том, что это ваш личный модуль и он не виден внешнему миру (я не уверен, что произойдет, если ваш модуль создаст модель CoreData, но, как я понимаю, дело обстоит не так).

Тимур Кучкаров
источник