У чому різниця між вбудованими двійковими файлами та пов’язаними фреймворками


87

При використанні зовнішнього фреймворку Xcode тепер має вбудовані двійкові файли , а також розділ Linked Frameworks .

введіть тут опис зображення

Коли ви завантажуєте зовнішній фреймворк і Finder-> перетягуєте його в Xcode, він розміщує фреймворк у розділі " Зв'язані фреймворки та бібліотеки ".

Коли ви створюєте бібліотеку за допомогою Carthage, рекомендується перетягнути її до розділу Вбудовані двійкові файли .

Здається, обидва вони працюють з точки зору зв’язку, оскільки API стає доступним у будь-якому випадку, ще більше, додаючи фреймворк у розділ Вбудовані двійкові файли , він також автоматично додається у розділ Пов’язані фреймворки та бібліотеки .

Отже, хто правий? Карфаген чи решта Інтернету? і чому існує 2 варіанти включення зовнішніх ресурсів у проекти Xcode?


І чи працює це під час тестування на пристрої?
trojanfoe

@trojanfoe так, це так.
Максим Векслер

Це не має сенсу, якщо тільки це 1) у розділі вбудованих двійкових файлів або 2) не має кроку збірки для копіювання фреймворку в пакет програм під час збірки.
trojanfoe

2
Карфаген рекомендує перетягувати у "Вбудовані двійкові файли" лише для додатків OSX. Для iOS вони рекомендують лише "Зв’язані фреймворки та бібліотеки".
Damnum

Відповіді:


72
  1. Пов’язання - ми повинні пов’язати фреймворк, якщо ми використовуємо будь-який API, визначений у ньому.

  2. Вбудовування - Цей процес забезпечить вбудовану структуру в пакет додатків і, можливо, допоможе обмінюватися кодом між програмою та будь-якими розширеннями. Ми вбудовуємо лише сторонні фреймворки, а не ті, що надаються iOS, оскільки вони легко доступні на пристрої. Якщо ми вбудовуємо, це означає, що нам також потрібно буде зв’язати їх, щоб Xcode міг компілювати та створювати збірку. Коли програма працює на пристрої, вбудований фреймворк буде завантажений у пам’ять, коли це потрібно.


1
Що ви маєте на увазі з частиною "коли потрібно"? Чи означає це, що вбудований фреймворк завантажується, коли це потрібно під час виконання? Крім того, коли, на вашу думку, зв'язок відбуватиметься для динамічного фреймворку?
bartosss

Чи потрібен нам випадок, embedа не linkвін? І навпаки? І чому?
allenlinli

Я думаю, вам потрібно лише зв’язувати фреймворки, API яких ви використовуєте безпосередньо в коді, транзитивні залежності, на які не посилається код програми, слід просто вбудовувати, якщо я правильно.
Вернер Альтевішер

15

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

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


2
"Вбудовування двійкового файлу полегшить встановлення вашого продукту для користувача, якщо у них ще немає робочої інсталяції цього матеріалу на своїх машинах", звучить як OSX, а не iOS ... якщо у них немає бібліотеки встановлений (тобто нестандартний), тоді програма просто не завантажується.
trojanfoe

він не тільки не завантажувався, @trojanfoe, його було б відхилено, і ви не змогли б встановити його спочатку (якщо ви не розробник або не використовуєте корпоративний обліковий запис ...)
doggod

Динамічно пов’язані фреймворки можливі з iOS 8
Басті

Коли користувач встановлює вашу програму і якщо ця програма включає динамічно пов’язану структуру, її можна шукати автоматично. Однак це додатковий момент, який може не вдатися під час встановлення користувачем, що спричиняє помилку редагування посилання, яка припиняє роботу програми. Тому я не бачу причини, чому відповідь повинна стосуватися лише OS X, а не iOS. Будь ласка, будьте більш конкретні, якщо ви бачите можливість для покращення щодо моєї відповіді. Або проголосуйте за цю відповідь, щоб зробити колегу-розробника повноправним членом SO, якщо ви вважаєте, що відповідь вже є точною;)
Басті

Я заперечую проти необов’язкового аспекту вашої відповіді. Якщо фреймворк сторонній, тоді він повинен бути частиною набору додатків. Період. Це також в значній мірі стосується додатків OSX (звичайно, для програм, що розповсюджуються через Mac App Store).
trojanfoe

0

Linkingдокладніше про Linkerте, що працює під час компіляції або часу завантаження / запуску. Linker скопіюйте a Libraryу цільовий двійковий файл. Оскільки Frameworkавтономний, Linkerу цьому випадку відповідає за пошук і зв'язок Dynamic Frameworkвсередині шляху завантажувача системи або за пошук і зв'язок всередині пакета .

Embedding- це процес копіювання двійкового файлу в цільовий двійковий файл. В результаті вона буде розташована всередині.

Детальніше читайте тут


-3

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.