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


151

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

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

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


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

Ответы:


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

Пока что кажется, что я хочу подпроект, и эта статья была идеальной. Я заметил один странный побочный эффект: у подпроекта, который я перетащил в свой основной проект, также есть мой тестовый код (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]
[Динамический компоновщик]


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, но, как я понимаю, дело обстоит не так).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.