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


151

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

Я не знаю, чи це повинна бути статична бібліотека, динамічна бібліотека чи фреймворк, і чесно кажучи, я не дуже впевнений, у чому різниця, і як мені це зробити, і налаштувати її на Xcode.

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


Ви можете створити зонтичний структуру , яка є чим - щось на кшталт «рамки в рамках» stackoverflow.com/a/27638841/1582217
Мохд Іфтікар Qurashi

Відповіді:


204

По-перше, деякі загальні визначення (специфічні для iOS):

Статична бібліотека - одиниця коду, пов'язана в час компіляції, яка не змінюється.

Тим НЕ менше, бібліотеки статичні IOS які НЕ можуть містити зображення / активи (тільки код). Ви можете подолати цю проблему, використовуючи медіа-пакет .

Краще, більш формальне визначення можна знайти у Вікіпедії тут .

Динамічна бібліотека - одиниця коду та / або активів, пов'язаних під час виконання, які можуть змінюватися.

Однак створювати динамічні бібліотеки для iOS дозволено лише Apple. Вам не дозволяється створювати ці програми, оскільки це додаток буде відхилено. (Дивіться цю іншу публікацію про підтвердження та міркування щодо подібного повідомлення).

Software Framework - це складений набір коду, що виконує завдання ... отже, ви насправді можете мати статичний фреймворк або динамічний фреймворк , який, як правило, є лише складеними версіями вище.

Докладнішу інформацію див. У програмі Wiki on Software Framework .

Отже, в iOS ваш єдиний варіант - в основному використовувати статичну бібліотеку або статичний фреймворк (головна відмінність полягає в тому, що статичний фреймворк поширюється як скомпільований .aфайл найчастіше, тоді як статична бібліотека може просто бути включена як підпроект - ви можете бачити весь код - який складається першим, а отриманий в ньому .aфайл використовується як залежність від проекту).

Тепер, коли нам зрозуміло (помилково) щодо цих умов, налаштування статичної бібліотеки та підтримки медіа-пакету для iOS не надто складно, і є багато навчальних посібників, як це зробити. Я особисто рекомендував би це:

https://github.com/jverkoey/iOS-Framework

Це досить простий посібник і не має недоліків мати справу з "підробленими статичними бібліотеками" ... перевірте це для отримання додаткової інформації ...

Коли ви створили свою статичну бібліотеку, це так само просто, як включити її як підмодуль в Git для використання в різних проектах.

Щасти.

EDIT

Що стосується підпроекту в рамках проекту, наскільки я знаю, для того, щоб це працювало / компілювалось правильно, вам, по суті, потрібно створити ланцюжок компіляції, де підпроект складений спочатку, що створює файл статичного фрейму, .aякий використовується як залежність за проектом.

Ось ще один корисний підручник, який розповідає про це:

http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/

EDIT 2

Що стосується iOS 8, Apple тепер дозволяє розробникам створювати динамічні рамки! (Примітка. У вашому додатку має бути мінімальна ціль iOS 8, щоб увімкнути динамічну рамку ... зворотне перенесення заборонено.)

Це додано як новий шаблон проекту. У Xcode 6.1 це можна знайти за адресою:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework

Поки здається, що підпроект - це те, що я хочу, і ця стаття була ідеальною. Я помітив один дивний побічний ефект: у підпроекту, який я перетягнув всередині свого основного проекту, також є мій код тестування (viewcontroller and nb, appdelegate тощо), і я переконався, що саме класи, які я хочу використовувати в Основний проект перевіряється для використання в статичній бібліотеці. Але чомусь, коли я пішов робити вкладені файли основного проекту мого основного проекту, він також показував торгові точки та дії з мого підпроекту. Це однозначно може призвести до певної плутанини. Якісь поради, як їх позбутися? Дякую!
піцафільми

Чи можна динамічний проект перетягнути на статичний проект, зробивши його статичним проектом? Я дуже розгублений, деяке уточнення було б справді чудовим! Заздалегідь дякую :-)
Равіндранат Акіла

1
@ JRG-Developer Назад перенесення динамічної рамки дозволено, якщо ви дотримуєтесь деяких правил: developer.apple.com/library/prerelease/ios/documentation/…
klefevre

Чи можна встановити нижчу мінімальну ціль і зробити бібліотеку необов’язковою?
kukudas

1. Чи можете ви включити кілька відомих прикладів статичної бібліотеки, динамічної бібліотеки, фреймворку? 2. Чи можете ви навести приклади, де вам потрібно було б це зробити? 3. Цікаво, в чому різниця між стручком і статичною бібліотекою?
Мед

30

Формат файлу Mach-O (Mach Object - .o)

У світі iOS кожен вихідний файл перетворюється в об’єктні файли - ABI [About] Mach-O файл [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(aka 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(він же динамічна спільна бібліотека, спільний об'єкт, динамічно пов'язана бібліотека [doc] ) динамічно пов'язаний з виконуваним додатком під час завантаження або виконання , але не копіюється в нього. На практиці пакет програм буде містити папку Frameworks з .dylibфайлом. Всі системні бібліотеки iOS та macOS є dynamic. Недоліком є ​​повільний час запуску, оскільки всі динамічні бібліотеки повинні бути скопійовані та пов'язані.

[Статичні та динамічні зв'язки]

Text-based stub library- .tbd[About] , це текстовий заголовок 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, томурозробникам не рекомендується створювати їх [Official doc] . Насправді це набір підкадрів (або вкладених фреймів). Коли ви створюєте рамку, яка має залежність, споживач (наприклад, додаток) несе відповідальність за додавання цієї залежності разом із вашою рамкою до проекту. Як розробник, природно спробувати знайти спосіб перекласти цей обов'язок від споживача до вашого. Як результат, ви вважаєте, щоUmbrella frameworkце є порятунком, але зазвичай це призводить до серйозних проблем із керуванням версій та складністю його створення та підтримки.

Fake Framework- є результатом конкретних операцій в рамках static libraryстворення пакету з .frameworkрозширенням, який буде вести себе як a dynamic framework. Цей метод використовувався, коли Xcode не підтримував створення фреймворку, оскільки не мав шаблону фреймворку. Один із реалізацій підроблених рамок . З Xcode 6 Apple додала підтримку для iOS.

Modular Framework[About] -@importце рамка, яка містить.modulemapфайл всередині. Модуль може містити підмодулі. Основна перевага полягає в тому, що ви економите час збиранняModular Framework.

Universal Library or Framework(aka 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, етап збирання "Копіювати ресурси ресурсів" статичних рамок не працює, як і статична бібліотека. Яка різниця між статичним фреймом і статичною бібліотекою?
toshi0383

@ toshi0383 Ви знайшли спосіб об'єднати статичну бібліотеку (.a) та її ресурси (.bundle) в єдину рамку, яку ми можемо поширити на споживача?
користувач121095

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.